2024-05-15 17:53:46 发布
网友
我几乎需要编写一个程序来检查一个列表是否有任何重复项,如果有,它会删除它们并返回一个新列表,其中包含没有重复/删除的项。这就是我所拥有的,但老实说我不知道该怎么做。
def remove_duplicates(): t = ['a', 'b', 'c', 'd'] t2 = ['a', 'c', 'd'] for t in t2: t.append(t.remove()) return t
获取唯一项集合的常用方法是使用^{}。集合是不同对象的无序集合。要从任何iterable创建集合,只需将其传递给内置的^{}函数。如果以后再次需要一个真正的列表,您可以类似地将集合传递给^{}函数。
下面的例子应该包括您要做的任何事情:
>>> t = [1, 2, 3, 1, 2, 5, 6, 7, 8] >>> t [1, 2, 3, 1, 2, 5, 6, 7, 8] >>> list(set(t)) [1, 2, 3, 5, 6, 7, 8] >>> s = [1, 2, 3] >>> list(set(t) - set(s)) [8, 5, 6, 7]
从示例结果中可以看到,原始顺序不会保持。如上所述,集合本身是无序集合,因此顺序丢失。将集合转换回列表时,将创建任意顺序。
如果顺序对你很重要,那么你就必须使用不同的机制。一个非常常见的解决方案是依赖^{}在插入期间保持键的顺序:
>>> from collections import OrderedDict >>> list(OrderedDict.fromkeys(t)) [1, 2, 3, 5, 6, 7, 8]
Starting with Python 3.7,内置字典也可以保证保持插入顺序,因此如果您使用的是Python 3.7或更高版本(或cpython3.6),也可以直接使用它:
>>> list(dict.fromkeys(t)) [1, 2, 3, 5, 6, 7, 8]
注意,首先创建字典,然后从中创建列表可能会有一些开销。如果实际上不需要维护顺序,那么使用集合通常会更好,特别是因为它可以为您提供更多的操作。查看this question了解更多详细信息,以及在删除重复项时保留顺序的其他方法。
最后请注意,set和OrderedDict/dict解决方案都要求您的项是可散列的。这通常意味着它们必须是不可变的。如果必须处理不可散列的项(例如列表对象),则必须使用慢速方法,在这种方法中,基本上必须将每个项与嵌套循环中的每个其他项进行比较。
set
OrderedDict
dict
在Python2.7中,从iterable中删除重复项的新方法是:
>>> from collections import OrderedDict >>> list(OrderedDict.fromkeys('abracadabra')) ['a', 'b', 'r', 'c', 'd']
在Python 3.5中,OrderedDict有一个C实现。我的计时显示,这是Python3.5各种方法中最快和最短的一种。
在Python 3.6中,常规dict变得既有序又紧凑。(此功能适用于CPython和PyPy,但可能不存在于其他实现中)。这为我们提供了一种新的快速重复数据消除方法,同时保留订单:
>>> list(dict.fromkeys('abracadabra')) ['a', 'b', 'r', 'c', 'd']
在Python 3.7中,常规dict保证在所有实现中都是有序的。因此,最短和最快的解决方案是:
这是一条单行线:list(set(source_list))将起作用。
list(set(source_list))
set是不可能有重复的东西。
更新:保序方法是两行:
from collections import OrderedDict OrderedDict((x, True) for x in source_list).keys()
这里我们使用的事实是OrderedDict记住键的插入顺序,并且在更新特定键的值时不会更改它。我们插入True作为值,但我们可以插入任何内容,只是不使用值。(set的工作方式与使用忽略值的dict类似。)
True
获取唯一项集合的常用方法是使用^{} 。集合是不同对象的无序集合。要从任何iterable创建集合,只需将其传递给内置的^{} 函数。如果以后再次需要一个真正的列表,您可以类似地将集合传递给^{} 函数。
下面的例子应该包括您要做的任何事情:
从示例结果中可以看到,原始顺序不会保持。如上所述,集合本身是无序集合,因此顺序丢失。将集合转换回列表时,将创建任意顺序。
维持秩序
如果顺序对你很重要,那么你就必须使用不同的机制。一个非常常见的解决方案是依赖^{} 在插入期间保持键的顺序:
Starting with Python 3.7,内置字典也可以保证保持插入顺序,因此如果您使用的是Python 3.7或更高版本(或cpython3.6),也可以直接使用它:
注意,首先创建字典,然后从中创建列表可能会有一些开销。如果实际上不需要维护顺序,那么使用集合通常会更好,特别是因为它可以为您提供更多的操作。查看this question了解更多详细信息,以及在删除重复项时保留顺序的其他方法。
最后请注意,
set
和OrderedDict
/dict
解决方案都要求您的项是可散列的。这通常意味着它们必须是不可变的。如果必须处理不可散列的项(例如列表对象),则必须使用慢速方法,在这种方法中,基本上必须将每个项与嵌套循环中的每个其他项进行比较。在Python2.7中,从iterable中删除重复项的新方法是:
在Python 3.5中,OrderedDict有一个C实现。我的计时显示,这是Python3.5各种方法中最快和最短的一种。
在Python 3.6中,常规dict变得既有序又紧凑。(此功能适用于CPython和PyPy,但可能不存在于其他实现中)。这为我们提供了一种新的快速重复数据消除方法,同时保留订单:
在Python 3.7中,常规dict保证在所有实现中都是有序的。因此,最短和最快的解决方案是:
这是一条单行线:
list(set(source_list))
将起作用。set
是不可能有重复的东西。更新:保序方法是两行:
这里我们使用的事实是
OrderedDict
记住键的插入顺序,并且在更新特定键的值时不会更改它。我们插入True
作为值,但我们可以插入任何内容,只是不使用值。(set
的工作方式与使用忽略值的dict
类似。)相关问题 更多 >
编程相关推荐