2017-05-04 87 views
1

我試圖讓遞歸的字典的所有組合,但我不能包裹我的頭周圍如何得到正確的輸出。本質上是深度優先搜索,它將輸入保存在(鍵,值)元組或類似的東西中。任何幫助讚賞。感謝/弗雷德Python遞歸設置值排列字典

輸入:

d = {"item1": {1, 2}, 
    "item2": {3, 4}, 
    "item3": {5, 6}} 

輸出:

"item1" 1 
"item2" 3 
"item3" 5 
"item3" 6 
"item2" 4 
"item3" 5 
"item3" 6 
"item1" 2 
"item2" 3 
"item3" 5 
"item3" 6 
"item2" 4 
"item3" 5 
"item3" 6 

編輯:燙髮需要進行遞歸繪製。也許一個插圖澄清了一點: enter image description here

一個樹結構工作,但沒有足夠的廣義我的目的,並編輯繁瑣。

更新:目前我硬編碼這些像這樣:

d = {"item1": {1, 2}, 
    "item2": {3, 4}, 
    "item3": {i for i in range(1, 5)}} 

for k in d["item1"]: 
    print ("item1", k) 
    for j in d["item2"]: 
     print ("item2", j) 
     for i in d["item3"]: 
      print("item3", i) 

這似乎是顯而易見的,其中遞歸發生,但我仍然有它的煩惱。謝謝大家迄今爲止所有的建議!它也是在python3中,如果這有什麼區別。

+0

_all一個dictionary_你必須要更精確的組合。按鍵?價值? – Elmex80s

+0

@JoeD發佈了一個優雅的答案,其中包含'[[perm for itertools.product([k],v)] for k,v in d.items()]',現在已被刪除。 –

+0

我不認爲字典是正在嘗試實現的輸出的正確數據結構。此外,你的圖只有'1'和'2'作爲項目值,這是你想要你的輸出有什麼? – AetherUnbound

回答

3

這將返回一個排列列表。

from itertools import product 

perms = [[perm for perm in product([key], d[key]) for key in d]] 

如果您正在尋找可能的鍵值對組合(可能總數爲18),則進行更新。

[print(prod) for prod in product(d, itertools.chain.from_iterable(d.values()))] 

輸出:

('item3', 5) 
('item3', 6) 
('item3', 1) 
('item3', 2) 
('item3', 3) 
('item3', 4) 
('item1', 5) 
('item1', 6) 
('item1', 1) 
('item1', 2) 
('item1', 3) 
('item1', 4) 
('item2', 5) 
('item2', 6) 
('item2', 1) 
('item2', 2) 
('item2', 3) 
('item2', 4) 
+0

'd [key]'前有一個額外的'in','.keys()'是多餘的,因爲'...對於d.keys()中的鍵' ...關鍵在D' - 否則很好的答案。 –

+0

哎呀,謝謝。 –

+0

非常好的解決方案,它不解決遞歸部分。總共應該有14個輸出,這是我的知識短缺的地方。也許排列不是我使用的正確的詞。添加了一個樹圖來進一步說明問題,因此我認爲深度優先搜索可以做到這一點,但無法弄清楚如何爲每個節點輸出一個元組。 – Fred

1

這是你在找什麼?

for first_level in d: 
    item_list = d[first_level] 
    for item in item_list: 
      print((first_level, item)) 

輸出

('item2', 3) 
('item2', 4) 
('item3', 5) 
('item3', 6) 
('item1', 1) 
('item1', 2) 
2

如何:

>>> for pair in itertools.chain(*([(k, i) for i in v] for k, v in d.items())): 
    print(pair) 

('item2', 3) 
('item2', 4) 
('item3', 5) 
('item3', 6) 
('item1', 1) 
('item1', 2) 

還是有點更清晰:

def key_value_permutations(d): 
    for k, v in d: 
     for p in itertools.product([k], v): 
      yield p 

然後:

>>> for p in key_value_permutations(d): 
    print p 

('item2', 3) 
('item2', 4) 
('item3', 5) 
('item3', 6) 
('item1', 1) 
('item1', 2) 

這兩種解決方案都使用生成器,因爲它們假設您的字典和集合將比您提供的示例更大,並且您只需對它進行迭代,因此您並不需要在內存中創建大型列表。如果大小可以忽略不計,列表解析可能會更快。

你不能指望一致的排序,因爲這兩個字符串和集合都沒有保證排序。