将列表字典简化为包含所有/唯一唯一值的单个列表

时间:2015-02-18 17:17:45

标签: python list dictionary list-comprehension

我有一个字典列表作为值,如下所示:

my_dict = {"a": [1, 6, 8, 4],
           "b": [2, 7, 4, 9, 13],
           "c": [9, 5, 6, 8, 11]
          }

我想要的是一个列表,其中包含字典列表中每个独特项目之一。

因此,my_list应为[1, 6, 8, 4, 2, 7, 9, 13, 5, 11]。我不关心订单。

我是这样做的:

my_list = []
for k in my_dict:
    for item in my_dict[k]:
        if item not in my_list:
            my_list.append(item)

这很有效,但我觉得有一个更优雅的解决方案,也许是使用列表理解。

2 个答案:

答案 0 :(得分:12)

使用sets;你可以用以下方法生成所有值的并集:

set().union(*my_dict.values())

演示:

>>> my_dict = {"a": [1, 6, 8, 4],
...            "b": [2, 7, 4, 9, 13],
...            "c": [9, 5, 6, 8, 11]
...           }
>>> set().union(*my_dict.values())
set([1, 2, 4, 5, 6, 7, 8, 9, 11, 13])

集合没有顺序(就像字典键是无序的),但是你声明你不关心输出的顺序。

答案 1 :(得分:1)

你可以:

  1. 迭代字典。
  2. 将列表值扩展为列表变量。
  3. 使用set方法删除重复项目。
  4. 代码:

    >>> my_dict = {"a": [1, 6, 8, 4],
    ...            "b": [2, 7, 4, 9, 13],
    ...            "c": [9, 5, 6, 8, 11]
    ...           }
    >>> my_list = []
    >>> for k, v in my_dict.items():
    ...    my_list.extend(v)
    ... 
    >>> my_list
    [1, 6, 8, 4, 9, 5, 6, 8, 11, 2, 7, 4, 9, 13]
    >>> my_list = list(set(my_list))
    >>> my_list
    [1, 2, 4, 5, 6, 7, 8, 9, 11, 13]
    >>> 
    

    通过设定操作。

    >>> my_list = set()
    >>> for i in my_dict.values():
    ...     my_list.update(i)
    ... 
    set([1, 2, 4, 5, 6, 7, 8, 9, 11, 13])
    >>>