我有两个python词典,如果键没有任何相同的值,我想返回字典键的组合。 有点像:
让我们说我的代码如下所示:
a={'dog':['hungry','fun'],'cat':['ugly','old'],'fish':[1,2,'hungry',4]}
b={'raccoon':['ugly',1,3,], 'bird':[18,'hungry'],'cat':['orange','short']}
这将返回
dog+raccoon, dog+cat, cat+bird, cat+cat, fish+cat
因为这些潜在配对中没有一个具有共同的字典值。如果有人能告诉我如何做到这一点,我将不胜感激。
答案 0 :(得分:2)
您可以使用套装:
from itertools import product
pairs = set()
for (ak, av), (bk, bv) in product(a.items(), b.items()):
if not set(av).intersection(set(bv)):
pairs.add("%s+%s" % tuple(sorted([ak, bk])))
print pairs
产地:
set(['bird+cat', 'cat+fish', 'cat+cat', 'cat+dog', 'dog+raccoon'])
如果您首先设置而不是列表,则效率会更高。
答案 1 :(得分:0)
可能这可以得到它:
a={'dog':['hungry','fun'],'cat':['ugly','old'],'fish':[1,2,'hungry',4]}
b={'raccoon':['ugly',1,3,], 'bird':[18,'hungry'],'cat':['orange','short']}
result = []
for b_key, b_value in b.iteritems():
for a_key, a_value in a.iteritems():
if not any(x in a_value for x in b_value):
result.append((a_key, b_key))
print(result)
[('dog', 'raccoon'), ('cat', 'bird'), ('fish', 'cat'), ('dog', 'cat'), ('cat', 'cat')]
答案 2 :(得分:0)
def no_shared(a,b):
res = []
pairs = [(x, y) for x in a for y in b]
for x,y in pairs:
if set(a[x]) & set(b[y]):
continue
res.append((x, y))
return res
基本上测试列表之间的任何交集(作为集合),然后如果它们有任何交集则跳过添加。
此外,如果列表值对于该词典中的该条目总是唯一的(从示例中看起来如此),那么最初将其作为一组存储将为您保存转换。