【问题标题】:Check if Python Dictionary Values within another Dictionary's Values检查 Python 字典值是否在另一个字典的值中
【发布时间】:2014-09-16 21:28:05
【问题描述】:

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

  1. 对于“a”中的 i:
  2. 对于“b”中的 j:
  3. 对于 i.items():
  4. 如果any.j.items()中有any.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 

因为这些潜在的配对都没有共同的字典值。如果有人能告诉我如何做到这一点,我将不胜感激。

【问题讨论】:

    标签: python loops for-loop dictionary


    【解决方案1】:

    你可以使用集合:

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

    如果您首先使用集合而不是列表,则效率会更高。

    【讨论】:

      【解决方案2】:

      也许这个能搞定:

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

      【讨论】:

        【解决方案3】:
        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 中的条目始终是唯一的(从示例中看起来如此),那么最初将其存储为一个集合可以节省转换。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-02
          • 2015-09-24
          • 1970-01-01
          • 2021-12-07
          • 2021-09-26
          相关资源
          最近更新 更多