如何使用列表理解从列表中删除重复项? [复制]

     2023-03-12     47

关键词:

【中文标题】如何使用列表理解从列表中删除重复项? [复制]【英文标题】:How to remove duplicate items from a list using list comprehension? [duplicate] 【发布时间】:2012-05-19 22:21:07 【问题描述】:

如何使用列表推导从列表中删除重复项?我有以下代码:

a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
b = []
b = [item for item in a if item not in b]

但它不起作用,只会产生相同的列表。为什么它会产生一个相同的列表?

【问题讨论】:

因为在您执行if item not in bb 是空的。列表推导在内存中完成,最后将结果分配给b 这意味着列表理解不像循环那样工作? 如果您不想使用集合,因为您想保留顺序,请查看itertools recipes 中的unique_everseen 迭代器。像这样使用:b = list(unique_everseen(a)) 这是一种循环,但它会一次性生成结果……这也不足为奇。每当您有表达式x = y 时,首先评估y,然后将结果分配给x。但是在评估y 时,x 不会被修改。如果换成b = list(item for item in a if item not in b),你会有同样的疑问吗? 【参考方案1】:

它生成的列表与b 在运行时不包含任何元素相同。 你想要什么:

>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
>>> b = []
>>> [b.append(item) for item in a if item not in b]
[None, None, None, None, None, None, None, None]
>>> b
[1, 2, 3, 5, 9, 6, 8, 7]

【讨论】:

小心使用list comprehensions for side effects。请改用常规的 for 循环。 这也是一个O(n²) 答案,其中,对于可散列的输入,O(n) 是可能的(with 或 without 保留顺序),对于不可散列但可排序的输入,@987654328 @ 是可能的(尽管它用排序排序替换了原始排序,除非你努力用它们的索引装饰和取消装饰输入并将其合并到排序和重复数据删除中,以便第二次排序可以恢复原始排序)。【参考方案2】:

如果您不介意使用与列表理解不同的技术,您可以使用一个集合:

>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
>>> b = list(set(a))
>>> print b
[1, 2, 3, 5, 6, 7, 8, 9]

【讨论】:

我看过set函数,只是想知道上面的代码有什么问题,是否可以纠正? set 不会保持初始顺序...所以请注意这一点 @AdiRoiban:那个can be fixed with minimal code changes。它比使用set 慢,但如果您使用的是 3.6+,则不会很多慢(如果您使用 OrderedDict 的 3.5 或更早版本,它的影响更大;> 3x 运行时间,而3.6+ 加上普通的dict 运行时间只增加了大约 66%)。【参考方案3】:

在使用a 中的值作为键构造的dict 上使用keys

b = dict([(i, 1) for i in a]).keys()

或者使用一个集合:

b = [i for i in set(a)]

【讨论】:

【参考方案4】:

列表不变的原因是b 开始时是空的。这意味着if item not in b 始终是True。只有在列表生成后,这个新的非空列表才会分配给变量b

【讨论】:

如果我理解正确,这意味着列表理解会一次性添加项目,而不是像循环一样一次检查和添加每个项目。 @Alinwndrld:我认为这不是一个有效的结论。这仅意味着在分配之前评估列表理解。该列表很可能在内部循环构建。【参考方案5】:

使用groupby:

>>> from itertools import groupby
>>> a = [1, 2, 3, 3, 5, 9, 6, 2, 8, 5, 2, 3, 5, 7, 3, 5, 8]
>>> [k for k, _ in groupby(sorted(a, key=lambda x: a.index(x)))]
[1, 2, 3, 5, 9, 6, 8, 7]

如果您不关心值首先出现在原始列表中的哪个顺序,请省略 key 参数,例如

>>> [k for k, _ in groupby(sorted(a))]
[1, 2, 3, 5, 6, 7, 8, 9]

您可以使用groupby 做一些很酷的事情。识别多次出现的项目:

>>> [k for k, v in groupby(sorted(a)) if len(list(v)) > 1]
[2, 3, 5, 8]

或者建立一个频率词典:

>>> k: len(list(v)) for k, v in groupby(sorted(a))
1: 1, 2: 3, 3: 4, 5: 4, 6: 1, 7: 1, 8: 2, 9: 1

itertools 模块中有一些非常有用的功能:chainteeproduct 等等!

【讨论】:

【参考方案6】:
>>> a = [10,20,30,20,10,50,60,40,80,50,40,0,100,30,60]
>>> [a.pop(a.index(i, a.index(i)+1)) for i in a if a.count(i) > 1]
>>> print(a)

【讨论】:

【参考方案7】:

对于 Python 3.6+,与Niek de Klein's mostly excellent solution 相比有一个改进(主要缺陷是它丢失了输入顺序)。由于dicts 现在是插入顺序的,您可以这样做:

b = list(dict.fromkeys(a))

在早期的 Python 上,你会这样做:

from collections import OrderedDict

b = list(OrderedDict.fromkeys(a))

虽然速度没有那么快(即使 OrderedDict 被移到 C 层,它仍然需要大量开销来支持不支持它们的 dict 避免的重新排序操作)。

【讨论】:

【参考方案8】:
>>> from itertools import groupby
>>> repeated_items = [2,2,2,2,3,3,3,3,4,5,1,1,1]
>>> [
...     next(group)
...     for _, group in groupby(
...         repeated_items,
...         key=repeated_items.index
...     )
... ]
[2, 3, 4, 5, 1]

【讨论】:

聪明的解决方案,我喜欢。缺点是index 调用,使其成为O(n²),并且假设输入已经分组(它不适用于[2,1,2])。您可以解决这两个问题,并且仍然保留输入顺序,使用修改后的 Schwartzian 变换(需要 from itertools import count, groupby):[v for v, _ in sorted([next(grp) for _, grp in groupby(sorted(zip(repeated_items, count())), key=lambda x: x[0])], key=lambda x: x[1])]。可能不值得麻烦,但我喜欢itertools 的疯狂。

使用循环从字符数组列表中删除重复项? [复制]

】使用循环从字符数组列表中删除重复项?[复制]【英文标题】:Removingduplicatesfromanarraylistofcharactersusingaloop?[duplicate]【发布时间】:2015-12-0707:06:52【问题描述】:publicstaticArrayList<Character>removeDuplicates(ArrayList<Character>data)A... 查看详情

如何从 Python 列表中删除重复项并保持顺序? [复制]

】如何从Python列表中删除重复项并保持顺序?[复制]【英文标题】:HowtoremoveduplicatesfromPythonlistandkeeporder?[duplicate]【发布时间】:2010-10-0313:18:03【问题描述】:给定一个字符串列表,我想按字母顺序对其进行排序并删除重复项。... 查看详情

如何通过 Oracle regexp_replace 从空格分隔列表中删除重复项? [复制]

】如何通过Oracleregexp_replace从空格分隔列表中删除重复项?[复制]【英文标题】:HowtoremoveduplicatesfromspaceseparatedlistbyOracleregexp_replace?[duplicate]【发布时间】:2017-03-0815:18:48【问题描述】:我有一个名为“ABAACD”的列表。我的预期结... 查看详情

如何使用 LINQ 从列表中获取重复项? [复制]

】如何使用LINQ从列表中获取重复项?[复制]【英文标题】:HowtogetduplicateitemsfromalistusingLINQ?[duplicate]【发布时间】:2010-09-2809:38:57【问题描述】:我有一个List&lt;string&gt;喜欢:List<String>list=newList<String>"6","1","2","4","6"... 查看详情

如何通过 Oracle 中的正则表达式从逗号分隔列表中删除重复项,但我不想要重复值? [复制]

】如何通过Oracle中的正则表达式从逗号分隔列表中删除重复项,但我不想要重复值?[复制]【英文标题】:HowtoremoveduplicatesfromcommaseparatedlistbyregexinOraclebutIdon\'twantduplicatesvalues?[duplicate]【发布时间】:2018-08-0703:08:33【问题描述】:... 查看详情

使用 Guava 从列表中删除重复项

...singGuava【发布时间】:2012-08-2720:23:51【问题描述】:我们如何在Guavaapi的帮助下从List中删除重复项?目前我正在关注这个:privateList<T>removeDuplicate(List<T>list)returnnewArrayList<T>(newLinked 查看详情

如何通过 Oracle regexp_replace 中的正则表达式从逗号分隔列表中删除重复项? [复制]

】如何通过Oracleregexp_replace中的正则表达式从逗号分隔列表中删除重复项?[复制]【英文标题】:HowtoremoveduplicatesfromcommaseparatedlistbyregexinOracleregexp_replace?[duplicate]【发布时间】:2014-12-2715:09:40【问题描述】:我有\'VA-HRD1,VA-HRD1,VA-NO... 查看详情

如何从Java列表中删除重复项

】如何从Java列表中删除重复项【英文标题】:HowtoremoveduplicatesfromSetoflistinJava【发布时间】:2021-12-1314:38:04【问题描述】:我有一组列表,我想从无论每个列表中的元素顺序如何删除重复项,如下所示:我有这个作为输入[[-1,-1,2]... 查看详情

如何从列表 Dart 中删除重复项 |扑

】如何从列表Dart中删除重复项|扑【英文标题】:HowtoDeleteduplicateitemsfromaListDart|Flutter【发布时间】:2021-12-1015:56:34【问题描述】:我有一套物品。从这里我想删除所有重复的值。我试过这个finalList=[......users!];和这个print(users.toSet... 查看详情

如何使用 Dart / Flutter 中的列表从列表中删除重复元素?

】如何使用Dart/Flutter中的列表从列表中删除重复元素?【英文标题】:HowtoremoveduplicateelementsfromalistusinglistsinDart/Flutter?【发布时间】:2020-12-1401:07:52【问题描述】:如何从Dart/Flutter中的列表中删除重复项?.toSet().toList()不起作用... 查看详情

从列表中删除重复项?

...复项,但我想从我的适配器中删除这些重复项,并在知道如何打印后将其打印出来?提前致谢。得到:在我的卡片视图中重复行但通过API。想要:只想打印一次并删除那些重复项。我的适配器:@OverridepublicvoidonBindViewHolder(@NonNullc 查看详情

pandas:如何从深度嵌套的列表中删除重复项

】pandas:如何从深度嵌套的列表中删除重复项【英文标题】:pandas:howtoremoveduplicatesfromadeeplynestedlistoflists【发布时间】:2021-09-1818:18:03【问题描述】:我有一个如下所示的熊猫数据框:df=pd.DataFrame(\'text\':[\'theweatherisnicethough\',\'How... 查看详情

从 Ocaml 中的列表列表中删除重复项?

...21-07-0120:24:42【问题描述】:我是Ocaml的新手,我被分配仅使用List模块删除列表列表的所有重复项。这是我写的代码:letsort_and_remove_duplicatesl=letsl=List.sortcomparelinletrecgolacc=match 查看详情

从 2D 列表中删除连续重复项,python?

...a2Dlist,python?【发布时间】:2014-04-1921:15:43【问题描述】:如何根据特定元素(在本例中为第二个元素)从2d列表中删除连续重复项。我尝试了一些与itertools的组合,但没有运气。谁能建议我如何解决这个问题?输入192.168.1.232>&g... 查看详情

在 Python 中,从列表中删除重复项以使所有元素都是唯一的*同时保留顺序*的最快算法是啥? [复制]

】在Python中,从列表中删除重复项以使所有元素都是唯一的*同时保留顺序*的最快算法是啥?[复制]【英文标题】:InPython,whatisthefastestalgorithmforremovingduplicatesfromalistsothatallelementsareunique*whilepreservingorder*?[duplicate]在Python中,从列表... 查看详情

使用正则表达式从逗号分隔列表中删除重复项 [重复]

】使用正则表达式从逗号分隔列表中删除重复项[重复]【英文标题】:Removeduplicatesfromcommaseparatedlistwithregexp[duplicate]【发布时间】:2018-01-0708:26:59【问题描述】:我有contract,clause1,Subsection1.1,contract,clause1,Subsection1.2,paragraph(a),contract... 查看详情

使用 Python 删除对象列表中的重复项

】使用Python删除对象列表中的重复项【英文标题】:RemoveduplicatesinlistofobjectwithPython【发布时间】:2011-05-0907:53:13【问题描述】:我有一个对象列表,我有一个充满记录的数据库表。我的对象列表具有标题属性,我想从列表中删... 查看详情

java示例代码_删除列表中的重复项,然后将列表复制到另一个列表中

java示例代码_删除列表中的重复项,然后将列表复制到另一个列表中 查看详情