簡體   English   中英

設定值排列字典的Python遞歸

[英]Python recursion over dictionary of set values permutations

我試圖遞歸地獲取字典的所有組合,但是我無法解決如何正確獲取輸出的問題。 本質上是深度優先搜索,它將輸入保存在(鍵,值)元組或類似內容中。 任何幫助表示贊賞。 謝謝/弗雷德

輸入:

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

編輯:燙發需要遞歸繪制。 也許插圖可以澄清一下: 在此處輸入圖片說明

樹形結構可以工作,但對於我的目的而言,歸納不夠充分,並且難以編輯。

更新:目前,我正在對這些進行硬編碼,如下所示:

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中。

這將返回排列列表。

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)

這個怎么樣:

>>> 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)

兩種解決方案都使用生成器,因為它們假定您的dict和set大於您提供的示例中的dict和set,並且您將對其進行迭代,因此您實際上不需要在內存中創建龐大的列表。 如果大小可以忽略不計,則列表理解可能會更快。

您不能指望一致的排序,因為字典和集合都沒有保證的排序。

這是您要找的東西嗎?

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM