删除列表中的重复项

几乎我需要编写一个程序来检查一个列表是否有任何重复项,如果有,它将删除它们,并返回一个新的列表以及不重复的项目。 这是我所拥有的,但说实话我不知道该怎么办。

def remove_duplicates():
    t = ['a', 'b', 'c', 'd']
    t2 = ['a', 'c', 'd']
    for t in t2:
        t.append(t.remove())
    return t

获得独特物品集合的常用方法是使用一set物品。 集合是不同对象的无序集合。 要从任何迭代中创建一个集合,只需将它传递给内置的set()函数即可。 如果你以后需要一个真正的列表,你可以同样将这个集合传递给list()函数。

以下示例应该涵盖您正在尝试执行的任何操作:

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

正如您从示例结果中看到的,原始订单不会被维护。 如上所述,集合本身是无序集合,所以订单就会丢失。 将集合转换回列表时,会创建任意顺序。

如果订单对您很重要,那么您将不得不使用不同的机制。 一个非常常见的解决方案是依靠OrderedDict在插入过程中保持键的顺序:

>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]

请注意,这具有首先创建字典的开销,然后从中创建一个列表。 所以如果你实际上并不需要保存订单,那么最好使用一套。 查看此问题以获取更多详细信息以及在删除重复项时保留订单的其他方法。


最后请注意, set以及OrderedDict解决方案都要求您的项目可哈希。 这通常意味着它们必须是不可变的。 如果您必须处理不可哈希的项目(例如列表对象),那么您将不得不使用一种缓慢的方法,其中基本上必须将每个项目与嵌套循环中的每个项目进行比较。


在Python 2.7中 ,从迭代中移除重复的新方法同时保持原始顺序:

>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys('abracadabra'))
['a', 'b', 'r', 'c', 'd']

在Python 3.5中 ,OrderedDict有一个C实现。 我的计时表明,现在这是Python 3.5各种方法中速度最快,最短的一种。

在Python 3.6中 ,常规字典变得既有序又紧凑。 (这个特性适用于CPython和PyPy,但在其他实现中可能不存在)。 这为我们提供了一种新的最快的重复数据删除方式,同时保留了订单

>>> list(dict.fromkeys('abracadabra'))
['a', 'b', 'r', 'c', 'd']

在Python 3.7中 ,常规字典保证在所有实现中都有序。 所以,最短和最快的解决方案是:

>>> list(dict.fromkeys('abracadabra'))
['a', 'b', 'r', 'c', 'd']

这是一个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 。)

链接地址: http://www.djcxy.com/p/24733.html

上一篇: Removing duplicates in lists

下一篇: How to concatenate text from multiple rows into a single text string in SQL server?