2017-11-08 9 views
-2

私は任意のPython辞書xを持っているので、各キーの値そのものがリストになります。リストの辞書のすべての組み合わせを計算するPythonメソッドを書くにはどうすればよいですか?

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

x考えるIは各辞書は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は任意の名前の任意の数のキーを持つことができます。

+0

これは間違いなくあなたの問題のより良い製剤です。何が理想的なのかは、あなたの努力、あなたが試みたものを含めることです。 –

+1

結果リストの4つの辞書の順番は関係ありません。 – timgeb

答えて

2

xは、残念ながらOrderedDictではないため、まず対応する注文のキーと値を取得する必要があります。

x = {"first_name": ["Mahmoud", "Pei-chi"], "second_name": ["Abadi", "Yao"]} 
keys = x.keys() 
values = (x[k] for k in keys) 

その後、それはかなり単純なリストの理解です。

from itertools import product 
result = [dict(zip(keys, t)) for t in product(*values)] 

と仮定xがOrderedDictありますか?私は簡単に1に変換できます。その後、それを行う方法?その場合

、あなただけ書くことができます。

result = [dict(zip(x.keys(), t)) for t in product(*x.values())] 
+0

'x'がOrderedDictであるとしますか?私は簡単に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'}] 
+0

ええ、あなたは本当にあなたが期待しているキーの順序、特に大規模な辞書のハードコードをしたいですか? – timgeb

0

あなたから起動した場合リストと辞書の基本操作あなたは上記の操作を行うことができますが、丁寧さの面で他のものほど最適化されていないので、操作のナットの複雑さは同じです。我々が期待するよう

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'}] 
0

あなたの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'}] 
関連する問題