如何编写python方法来计算列表的所有组合?

时间:2017-11-08 08:41:40

标签: python python-2.7 dictionary

我有一个任意的python字典x,这样每个键的值本身就是一个列表。这是一个例子:

x = {"first_name": ["Mahmoud", "Pei-chi"], "second_name": ["Abadi", "Yao"]}

给定x我想编写一个计算字典列表的方法,使每个字典具有与x相同的键,但值是每个列表元素的组合。所以在这种情况下,结果应该是:

[{"first_name": "Mahmoud", "second_name": "Abadi"}, 
 {"first_name": "Mahmoud", "second_name": "Yao"}, 
 {"first_name": "Pei-chi", "second_name": "Abadi"}, 
 {"first_name": "Pei-chi", "second_name": "Yao"}]

我该怎么办?字典x可以具有任意数量的具有任意名称的键。

4 个答案:

答案 0 :(得分:2)

您可以发出以下列表理解。

[CallerMemberType]

答案 1 :(得分:1)

Python itertools.product()对此有好处:

from itertools import product

x = {"first_name": ["Mahmoud", "Pei-chi"], "second_name": ["Abadi", "Yao"]}
dict_list = [{'first_name': f, 'second_name':s} for f, s in product(x['first_name'], x['second_name'])]

给你:

[{'first_name': 'Mahmoud', 'second_name': 'Abadi'}, {'first_name': 'Mahmoud', 'second_name': 'Yao'}, {'first_name': 'Pei-chi', 'second_name': 'Abadi'}, {'first_name': 'Pei-chi', 'second_name': 'Yao'}]

答案 2 :(得分:0)

如果你从列表和字典的基本操作开始,使用这个简单的for循环,你就可以进行上述操作,但是它在整洁性方面没有那么多优化,操作的螺母复杂性是相同的。

    lis = []
    for f in x:
        if f =='first_name':
            for l in x[f]:
                for j in x['second_name']:
                    dic ={}
                    dic['first-name']=l;dic['last_name']=j
                    lis.append(dic)

O / P将如我们所料:

    [{'first-name': 'Mahmoud', 'last_name': 'Abadi'},
    {'first-name': 'Mahmoud', 'last_name': 'Yao'},
    {'first-name': 'Pei-chi', 'last_name': 'Abadi'},
    {'first-name': 'Pei-chi', 'last_name': 'Yao'}]

答案 3 :(得分:0)

如果您的dict无序,请不要担心您可以使用有序的dict,它不会改变结果,每次都会给出相同的结果。

dict_1 = {"first_name": ["Mahmoud", "Pei-chi"], "second_name": ["Abadi", "Yao"]}

import itertools
import collections
from operator import itemgetter
ordered_dict=collections.OrderedDict(sorted(dict_1.items(), key=itemgetter(0)))

items=[]
for key,value in ordered_dict.items():
    items.append(value)
    print([{"first_name":item[0],"last_name" :item[1]} for item in itertools.product(*items, repeat=1) if len(item)>1])

输出:

[{'first_name': 'Mahmoud', 'last_name': 'Abadi'}, {'first_name': 'Mahmoud', 'last_name': 'Yao'}, {'first_name': 'Pei-chi', 'last_name': 'Abadi'}, {'first_name': 'Pei-chi', 'last_name': 'Yao'}]