0

假设我有一本字典 dictList = {1:[1,3,4,8], 2:[5,7,2,8], 3:[6,3,5,7]}

我想打印这样的所有组合: key,value 第一次迭代 1,1 2,5 3,6 第二次迭代 1,1 2,5 3,3 .... 等等

4

3 回答 3

1

假设您要做的是检索每组唯一的三个键值对:

from itertools import permutations
# define dictList
# define numkeys to be the number of keys in dictList
# define maxLen to be the number of items in each dict value
perms = permutations(range(maxLen),numKeys)
for p in perms:
    i = 1     # you're indexing your dictionary from 1, not 0
    while i <= numKeys:
        myfunction(i,dictList[i][p[i-1]])   # ...which is why this is awkward
        i += 1
于 2013-04-02T07:59:17.573 回答
0
    from itertools import product
    from itertools import izip_longest  # This is used to deal with variable length of lists

    dictList = {1:[1,3,4,8], 2:[5,7,2,8], 3:[6,3,5,7,8]}

    dict1 = [dict(izip_longest(dictList, v)) for v in product(*dictList.values())]

    for dict2 in dict1:
        for key, value in dict2.items():
            print key, value
于 2013-04-02T16:26:05.807 回答
0

就像已经说过的那样,您似乎错误地解释了您的问题。但我猜你想要类似的东西:

[(1, 1), (2, 5), (3, 6), (1, 3), (2, 7), (3, 3), (1, 4), (2, 2), ( 3, 5), (1, 8), (2, 8), (3, 7)]

我会尝试使用zip. 例如,您的值上的 zip 将关联所有第一项、所有第二项等。

警告:只有当您的列表长度相同时,它才会起作用!(否则你可以导入itertools.izip_longest替换 zip,额外的索引将返回 None)

>>> zip(*dictList.values())
[(1, 5, 6), (3, 7, 3), (4, 2, 5), (8, 8, 7)]

所以下面的代码:

for t in zip(*dictList.values()):
...    for i, k in enumerate(dictList.keys()):
...       print k, t[i]

将打印:

1 1
2 5
3 6
1 3
2 7
3 3
1 4
2 2
3 5
1 8
2 8
3 7

有一种方法可以在一行中完成:

>>> reduce(lambda cumul, v:cumul + list(zip(dictList.keys(), v)), zip(*dictList.values()), [])
[(1, 1), (2, 5), (3, 6), (1, 3), (2, 7), (3, 3), (1, 4), (2, 2), (3, 5), (1, 8), (2, 8), (3, 7)]

是的,我知道,它不是真正可读的,但我发现尝试在一行 xD 中做这种事情很有趣,在使用它之前花点时间了解正在发生的事情。

希望对您有所帮助,祝您有美好的一天。

于 2013-04-02T08:52:36.800 回答