假设我有一本字典 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 .... 等等
假设我有一本字典 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 .... 等等
假设您要做的是检索每组唯一的三个键值对:
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
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
就像已经说过的那样,您似乎错误地解释了您的问题。但我猜你想要类似的东西:
[(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 中做这种事情很有趣,在使用它之前花点时间了解正在发生的事情。
希望对您有所帮助,祝您有美好的一天。