如何检查列表是否有任何重复项,并返回一个没有重复项的新列表?
import pandas as pd
myList = [1, 2, 3, 1, 2, 5, 6, 7, 8]
cleanList = pd.Series(myList).drop_duplicates().tolist()
print(cleanList)
#> [1, 2, 3, 5, 6, 7, 8]
并且顺序保持不变。
这个方法会关注顺序而不会太麻烦(使用OrderdDict和其他方式)。可能不是最Pythonic的方式,也不是最简单的方式,但是可以解决问题:
def remove_duplicates(item_list):
''' Removes duplicate items from a list '''
singles_list = []
for element in item_list:
if element not in singles_list:
singles_list.append(element)
return singles_list
list
一样重要);list
中元素数量上呈二次方级别,扩展性极差。保持顺序减少变量:
假设我们有一个列表:
l = [5, 6, 6, 1, 1, 2, 2, 3, 4]
减少变量(效率低下):
>>> reduce(lambda r, v: v in r and r or r + [v], l, [])
[5, 6, 1, 2, 3, 4]
5倍速度更快,但更加精密。
>>> reduce(lambda r, v: v in r[1] and r or (r[0].append(v) or r[1].add(v)) or r, l, ([], set()))[0]
[5, 6, 1, 2, 3, 4]
default = (list(), set())
# user list to keep order
# use set to make lookup faster
def reducer(result, item):
if item not in result[1]:
result[0].append(item)
result[1].add(item)
return result
reduce(reducer, l, default)[0]
def rem_dupes(dup_list):
yooneeks = []
for elem in dup_list:
if elem not in yooneeks:
yooneeks.append(elem)
return yooneeks
例子:
my_list = ['this','is','a','list','with','dupicates','in', 'the', 'list']
使用方法:
rem_dupes(my_list)
这是一个包含重复元素的列表。
有很多其他的答案提出了不同的方法来完成这个任务,但是它们都是批量操作,并且其中一些会丢失原始顺序。这可能取决于你的需求而可以接受,但如果你想按照每个值的第一个实例的顺序迭代值,并且你想在运行时逐个删除重复项而不是一次性删除全部重复项,那么你可以使用这个生成器:
def uniqify(iterable):
seen = set()
for item in iterable:
if item not in seen:
seen.add(item)
yield item
for unique_item in uniqify([1, 2, 3, 4, 3, 2, 4, 5, 6, 7, 6, 8, 8]):
print(unique_item, end=' ')
print()
输出:
1 2 3 4 5 6 7 8
unique_list = list(uniqify([1, 2, 3, 4, 3, 2, 4, 5, 6, 7, 6, 8, 8]))
print(unique_list)
输出:
[1, 2, 3, 4, 5, 6, 7, 8]
seen = set(iterable); for item in seen: yield item
几乎肯定更快。(我没有尝试过这个特定的情况,但这就是我的猜测。) - dylnmcdata=[1, 2, 3, 1, 2, 5, 6, 7, 8]
uni_data=[]
for dat in data:
if dat not in uni_data:
uni_data.append(dat)
print(uni_data)
使用 set :
a = [0,1,2,3,4,3,3,4]
a = list(set(a))
print a
使用唯一的:
import numpy as np
a = [0,1,2,3,4,3,3,4]
a = np.unique(a).tolist()
print a
在Python中,仅通过Python的内置类型就可以很容易地处理像这样的复杂情况。
让我来向你展示如何做到!
方法1:通用情况
一行代码的方式(1 line code)可以在保持排序顺序的同时删除列表中的重复元素。
line = [1, 2, 3, 1, 2, 5, 6, 7, 8]
new_line = sorted(set(line), key=line.index) # remove duplicated element
print(new_line)
[1, 2, 3, 5, 6, 7, 8]
方法2:特殊情况
TypeError: unhashable type: 'list'
处理不可哈希对象的特殊情况 (3行代码)
line=[['16.4966155686595', '-27.59776154691', '52.3786295521147']
,['16.4966155686595', '-27.59776154691', '52.3786295521147']
,['17.6508629295574', '-27.143305738671', '47.534955022564']
,['17.6508629295574', '-27.143305738671', '47.534955022564']
,['18.8051102904552', '-26.688849930432', '42.6912804930134']
,['18.8051102904552', '-26.688849930432', '42.6912804930134']
,['19.5504702331098', '-26.205884452727', '37.7709192714727']
,['19.5504702331098', '-26.205884452727', '37.7709192714727']
,['20.2929416861422', '-25.722717575124', '32.8500163147157']
,['20.2929416861422', '-25.722717575124', '32.8500163147157']]
tuple_line = [tuple(pt) for pt in line] # convert list of list into list of tuple
tuple_new_line = sorted(set(tuple_line),key=tuple_line.index) # remove duplicated element
new_line = [list(t) for t in tuple_new_line] # convert list of tuple into list of list
print (new_line)
[
['16.4966155686595', '-27.59776154691', '52.3786295521147'],
['17.6508629295574', '-27.143305738671', '47.534955022564'],
['18.8051102904552', '-26.688849930432', '42.6912804930134'],
['19.5504702331098', '-26.205884452727', '37.7709192714727'],
['20.2929416861422', '-25.722717575124', '32.8500163147157']
]
在Python 3中,有一种非常简单的方法:
>>> n = [1, 2, 3, 4, 1, 1]
>>> n
[1, 2, 3, 4, 1, 1]
>>> m = sorted(list(set(n)))
>>> m
[1, 2, 3, 4]
sorted(list(...))
是多余的(sorted
已经隐式地将其参数转换为新的 list
,对其进行排序,然后返回新的 list
,因此同时使用两者意味着制作一个不必要的临时 list
)。如果结果不需要排序,请仅使用 list
,如果结果需要排序,请仅使用 sorted
。 - ShadowRanger不幸的是,这里大多数答案要么没有保留顺序,要么太长了。这里有一个简单的、保留顺序的答案。
s = [1,2,3,4,5,2,5,6,7,1,3,9,3,5]
x=[]
[x.append(i) for i in s if i not in x]
print(x)
这将会给你一个去除重复项但保持顺序的x。
[1, 2, 3, 4, 5, 2, 4]
->[1, 3, 5]
,因为2和4是重复的。 - 9769953[1,2,3,1]→[1,2,3]
)是否有意义? 接受的答案暗示了可能实现第二个子问题的方法(即[1,2,3,1]→[2,3]
)。 目前,问题和最佳答案在某种程度上不完全同步。 - Mateen Ulhaq