设置值排列字典的Python递归

时间:2017-05-04 01:33:33

标签: python dictionary recursion set permutation

我试图以递归方式获取字典的所有组合,但我无法理解如何正确获取输出。本质上是深度优先搜索,它将输入保存在(键,值)元组或类似的东西中。任何帮助赞赏。谢谢/弗雷德

输入:

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

编辑:需要递归绘制perms。也许一个例子澄清了一点: 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中。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)

两种解决方案都使用生成器,因为它们假设你的dicts和sets会比你提供的示例更大,你只需要迭代它就可以不需要在内存中创建一个巨大的列表。如果大小可以忽略不计,列表推导可能会更快。

你不能指望一致的排序,因为dicts和sets都没有保证订购。

答案 2 :(得分: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)