【问题标题】:Python list comprehension: adding unique elements into list?Python列表理解:将唯一元素添加到列表中?
【发布时间】:2016-09-10 07:29:34
【问题描述】:

我正在尝试编写更简单的代码来将唯一元素添加到 python 列表中。我有一个包含字典列表的数据集,我正在尝试遍历字典中的列表

为什么这不起作用?它是添加所有项目,包括重复项,而不是添加唯一项目。

unique_items = []
unique_items = [item for d in data for item in d['items'] if item not in unique_items]

对比较长的有效形式:

unique_items = []
for d in data:
    for item in d['items']:
        if (item not in unique_items):
            unique_items.append(item)

有没有办法使用列表理解来完成这项工作,还是我坚持使用双 for 循环?我想保留这个订单。

这是字典列表:

[{"items":["apple", "banana"]}, {"items":["banana", "strawberry"]}, {"items":["blueberry", "kiwi", "apple"]}]

输出应该是 ["apple", "banana", "strawberry", "blueberry", "kiwi"]

我注意到有人在另一个帖子中提出了类似的问题:Python list comprehension, with unique items,但我想知道是否有其他方法可以在没有 OrderedDict 的情况下做到这一点,或者这是否是最好的方法

【问题讨论】:

  • 请提供更多信息:您的字典列表对任何提供帮助的人都非常有用。
  • 更好地使用一套,它会为你删除所有重复项
  • 您要保留订单吗?
  • 是的,订购很重要
  • 在这种情况下,另一个问题的回答是最简单的方法。如果你真的想要替代品,请查看OrderedSet recipe

标签: python list python-2.7 list-comprehension


【解决方案1】:

最简单的方法是使用OrderedDict

from collections import OrderedDict
from itertools import chain

l = [{"items":["apple", "banana"]}, {"items":["banana", "strawberry"]}, {"items":["blueberry", "kiwi", "apple"]}]
OrderedDict.fromkeys(chain.from_iterable(d['items'] for d in l)).keys() # ['apple', 'banana', 'strawberry', 'blueberry', 'kiwi']

如果您想要替代方案,请检查 OrderedSet recipepackage 基于它。

【讨论】:

    【解决方案2】:

    all_items 在列表理解过程中不会被连续覆盖,因此您会一直在空列表中查找内容。

    我会这样做:

    data = [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 1, 2, 3, 4,]
    
    items = []
    _ = [items.append(d) for d in data if d not in items]
    print(items)
    

    我得到:

    [1, 2, 3, 4, 5, 6]
    

    但无论如何都有更有效的方法来做到这一点。

    【讨论】:

    • 有哪些更有效的方法?
    • set 就像在另一个答案中一样,numpy.unique
    【解决方案3】:

    为什么不直接使用set

    例如-

    >>> data = {1: {'items': [1, 2, 3, 4, 5]}, 2: {'items': [1, 2, 3, 4, 5]}}
    >>> {val for item in data for val in data[item]['items']}
    >>> {1, 2, 3, 4, 5}
    

    如果你想要一个列表:

    >>> list(repeat above)
    >>> [1, 2, 3, 4, 5]
    

    您也可以只使用 set 关键字来代替花括号 {},因为对于某些人来说,花括号可能过于晦涩。

    这是syntax的链接

    【讨论】:

    猜你喜欢
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多