web-dev-qa-db-ja.com

Pythonのリストのdictの値からすべての組み合わせを生成する方法

私はdictでインデックスされたリストにある値のすべての組み合わせを生成したいと思います:

{'A':['D','E'],'B':['F','G','H'],'C':['I','J']}

毎回、各dictエントリの1つのアイテムが選択され、他のキーのアイテムに結合されるため、次のようにします。

['D','F','I']
['D','F','J']
['D','G','I']
['D','G','J']
['D','H','I']
...
['E','H','J']

itertoolsのリストの項目の組み合わせを生成するものがあることは知っていますが、値の「プール」が異なるため、ここでは使用できないと思います。

これを行うための既存の解決策はありますか、または自分でそれを行うにはどうすればよいですか?この入れ子構造にかなりこだわっています。

13
ibi0tux
import itertools as it

my_dict={'A':['D','E'],'B':['F','G','H'],'C':['I','J']}
allNames = sorted(my_dict)
combinations = it.product(*(my_dict[Name] for Name in allNames))
print(list(combinations))

印刷する

[( 'D'、 'F'、 'I')、( 'D'、 'F'、 'J')、( 'D'、 'G'、 'I')、( 'D'、 'G '、' J ')、(' D '、' H '、' I ')、(' D '、' H '、' J ')、(' E '、' F '、' I ')、( 「E」、「F」、「J」)、(「E」、「G」、「I」)、(「E」、「G」、「J」)、(「E」、「H」、 'I')、( 'E​​'、 'H'、 'J')]

27
Maryam
from itertools import combinations

a=['I1','I2','I3','I4','I5']

list(combinations(a,2))

出力は次のようになります。

[('I1', 'I2'),
 ('I1', 'I3'),
 ('I1', 'I4'),
 ('I1', 'I5'),
 ('I2', 'I3'),
 ('I2', 'I4'),
 ('I2', 'I5'),
 ('I3', 'I4'),
 ('I3', 'I5'),
 ('I4', 'I5')]
2
Umesh Nepal

補足として、ここにそれを行うコードがありますPython =アイデアを得ることができますが、itertoolsは実際により効率的です。

res = [[]]
for _, vals in my_dict.items():
    res = [x+[y] for x in res for y in vals]
print(res)
1
Max

Maryamが提供するCartesian製品を使用する以外に、単純な入れ子ループを使用して、必要なものを取得することもできます。

0
palebluedot