检查Python字典的值是否在另一个字典的值中

2024-05-12 19:50:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个python字典,如果字典键之间没有共同的值,我想返回它们的组合。 有点像:

  1. 因为我在‘a’:
  2. 对于“b”中的j:
  3. 对于i.items():
  4. 如果.j.items()中有.i.items())
  5. 继续
  6. 否则告诉我怎么把所有的组合配对在一起

假设我的代码如下所示:

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 

因为这些潜在的配对都没有共同的字典值。如果有人能告诉我怎么做我会很感激的。你知道吗


Tags: 代码字典itemsoldcatshortdogfun
3条回答

可以使用集合:

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

如果您首先使用集合而不是列表,那么这会更有效。你知道吗

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

基本上测试列表(作为集合)之间的任何交集,如果它们有交集,则跳过添加。你知道吗

另外,如果列表值对于该dict中的条目总是唯一的(从示例来看似乎是这样),那么最初将其存储为一个集合可以节省转换。你知道吗

也许这可以得到它:

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

相关问题 更多 >