代码之家  ›  专栏  ›  技术社区  ›  significance

在python中重新组合列表/字典

  •  1
  • significance  · 技术社区  · 14 年前

    从…开始 this question

    我在python中有以下列表,希望将它们重新组合成字典/列表:

    fromfruits = { "names" : ['banana','grapefruit','apple'] , "colors" : ['yellow','pink','green'], ... }
    

    tofruits = [
    {'name':'banana','color':'yellow',...}, 
    {'name':'grapefruit','color':'pink',...},
    {'name':'apple','color':'green',...}
    ]
    

    最好的方法是什么 在fromfruits中列出?

    请帮忙!:)

    6 回复  |  直到 7 年前
        1
  •  4
  •   Seth Johnson    14 年前

    由于要求现在更为笼统:

    >>> from itertools import izip
    >>> ff = {'colors': ['yellow', 'pink', 'green'], 'names': ['banana', 'grapefruit', 'apple'], 'blah': ['a','b','c']}
    
    >>> [dict(izip(ff.iterkeys(), v)) for v in izip(*ff.itervalues())]
    [{'blah': 'a', 'colors': 'yellow', 'names': 'banana'},
     {'blah': 'b', 'colors': 'pink', 'names': 'grapefruit'},
     {'blah': 'c', 'colors': 'green', 'names': 'apple'}]
    

    keys values 是相同的(假设字典没有中间的修改)。

        2
  •  3
  •   Jochen Ritzel    14 年前

    ff = dict(name=['banana','grapefruit','apple'], color=['yellow','pink','green'], 
              yummy=[True,False,True])
    

    你可以用 zip 再一次:

    # make fruits [('yellow', True, 'banana'), ('pink', False, 'grapefruit'), ... ]
    fruits = zip(*ff.itervalues())
    
    # then add the names to each fruit
    tofruits = [dict(zip(ff.iterkeys(),fruit)) for fruit in fruits]
    # gives: [{'color': 'yellow', 'yummy': True, 'name': 'banana'}, ... ]
    
        3
  •  1
  •   Ignacio Vazquez-Abrams    14 年前
    [dict((x, fromfruits[x][n]) for x in fromfruits.keys())
      for n in range(len(next(fromfruits.itervalues())))]
    

        4
  •  0
  •   Eli Bendersky    14 年前
    >>> fromfruits
    {'colors': ['yellow', 'pink', 'green'], 'names': ['banana', 'grapefruit', 'apple']}
    >>> [{'name': name, 'color': color} for name in fromfruits['names'] for color in fromfruits['colors']]
    [{'color': 'yellow', 'name': 'banana'}, {'color': 'pink', 'name': 'banana'}, {'color': 'green', 'name': 'banana'}, {'color': 'yellow', 'name': 'grapefruit'}, {'color': 'pink', 'name': 'grapefruit'}, {'color': 'green', 'name': 'grapefruit'}, {'color': 'yellow', 'name': 'apple'}, {'color': 'pink', 'name': 'apple'}, {'color': 'green', 'name': 'apple'}]
    

    现在更详细地说(为了清晰起见,重新格式化):

    >>>[{'name': name, 'color': color} 
            for name in fromfruits['names'] 
            for color in fromfruits['colors']]
    

    这是一个“列表理解”,有两个 for 所有名字和颜色的组合。如果你想混合其他属性,比如“shape”或者其他什么,你可以添加第三个循环。

        5
  •  0
  •   eduffy    14 年前

    不是很蟒蛇,但是。。。

    keys = fromfruits.keys()
    nvals = len(fromfruits[keys[0]])
    tofruits = [ ]
    for i in range(nvals):
        tofruits.append ({ })
        for k in keys:
            tofruits[-1][k] = fromfruits[k][i]
    
        6
  •  0
  •   dtlussier    14 年前

    由于嵌套字典的存在,这个问题比一般的列表理解要复杂一些。

    然而

    尝试:

    tofruits = [ {'name':n, 'color':c} for n,c in zip(fromfruits['names'], 
                                                  fromfruits['colors']) ]
    

    这里是 zip 函数用于生成与正确的 name color . 这是一个很好的方法,因为它们都存储在 fromfruits

    这些元组(来自 拉链 )然后打开包装 n c