【问题标题】:intersecting lists in a dict (more than two)字典中的相交列表(两个以上)
【发布时间】:2015-12-21 12:34:16
【问题描述】:

我有一个不同长度的字典。每个条目都有一个名称和一个列表,如下所示:

somedict = {'Name': [1, 2, 3], 'Name2': [], 'Name3': [2,3] }

如何获得以下列表的交集?我需要动态地做,我不知道dict会持续多久。

我知道,对于上面的列表,交叉点是空的。但是对于

somedict = {'Name': [1, 2, 3], 'Name3': [2,3] }

它应该返回

[2, 3]

【问题讨论】:

    标签: python dictionary intersection


    【解决方案1】:

    通常,交集是一个集合操作。因此,您可能希望将字典的值转换为集合,然后运行交集,就像这样

    >>> set.intersection(*(set(values) for values in data.values()))
    {2, 3}
    

    如果您希望结果为列表,只需将结果集转换为列表,如下所示

    >>> list(set.intersection(*(set(values) for values in data.values())))
    [2, 3]
    

    这里,表达式*(set(values) for values in data.values()) 创建了一个生成器,它生成转换为集合的字典项的每个值,并且生成器是unpackedset.intersection 函数。

    【讨论】:

      【解决方案2】:

      使用reduce 提供另一种方式。

      reduce(lambda x,y: set(x) & set(y), the_list)
      

      它的行为方式是这样的(例如the_list = [[1, 2, 3], [], [2,3]]):

      set([1,2,3]) & set([]) => tmp_result
      set(tmp_result) & set([2,3]) => final_result
      

      所以解决方案是:

      >>> dict_one = {'Name': [1, 2, 3], 'Name2': [], 'Name3': [2, 3]}
      >>> reduce(lambda x,y: set(x) & set(y), dict_one.values())
      set([])
      >>> dict_two = {'Name': [1, 2, 3], 'Name3': [2, 3]}
      set([2, 3])
      >>> list(dict_two)
      [2, 3]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-15
        • 1970-01-01
        • 1970-01-01
        • 2023-01-18
        • 2023-03-25
        • 2018-07-23
        • 1970-01-01
        相关资源
        最近更新 更多