【问题标题】:Simplify this dictionary of lists into a single list containing all/only unique values将此列表字典简化为包含所有/仅唯一值的单个列表
【发布时间】:2015-04-19 19:34:16
【问题描述】:

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

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)

这可行,但我觉得有一个更优雅的解决方案,也许使用列表推导。

【问题讨论】:

  • 使用 set 或 hashes/dict 来获得 O(N) 复杂度

标签: python list dictionary list-comprehension


【解决方案1】:

你可以:

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

代码:

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

【讨论】:

  • 既然可以只建立一个集合,为什么要先建立一个列表呢?例如,您的循环方法可以轻松地在循环中使用my_set = set() 然后my_set.update(v)
  • 这行得通,但我发现它只是稍微优雅一点。
  • @MartijnPieters:是的,正确。谢谢你。总是审查我的代码并提出建议。
【解决方案2】:

使用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])

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多