我知道这可能是一个简单的答案,但我想不出来。在Python中保留列表中重复项的最佳方法是什么:
x = [1,2,2,2,3,4,5,6,6,7]
输出应该是:
[2,6]
我找到了这个链接:在Python中查找(并保留)子列表的重复项,但我对Python还比较新手,无法将其应用于简单的列表。
我知道这可能是一个简单的答案,但我想不出来。在Python中保留列表中重复项的最佳方法是什么:
x = [1,2,2,2,3,4,5,6,6,7]
[2,6]
我找到了这个链接:在Python中查找(并保留)子列表的重复项,但我对Python还比较新手,无法将其应用于简单的列表。
我会使用 collections.Counter
:
from collections import Counter
x = [1, 2, 2, 2, 3, 4, 5, 6, 6, 7]
counts = Counter(x)
output = [value for value, count in counts.items() if count > 1]
以下是另一个版本,它保留了首次复制物品的顺序,假设传入的序列包含可哈希的项目,并且可以追溯到语言引入set
或yield
的时间(无论那是何时)。
def keep_dupes(iterable):
seen = set()
dupes = set()
for x in iterable:
if x in seen and x not in dupes:
yield x
dupes.add(x)
else:
seen.add(x)
print list(keep_dupes([1,2,2,2,3,4,5,6,6,7]))
OrderedDict
呢?为什么不直接使用[k for k in x if counts[k] > 1]
?事实上,这比我之前的方法更好。我会进行更新... - mgilsonseen.add
和条件的顺序 - 或者干脆放弃那部分... - mgilson如果列表已经排序,这是一种简短的方法:
x = [1,2,2,2,3,4,5,6,6,7]
from itertools import groupby
print [key for key,group in groupby(x) if len(list(group)) > 1]
groupby
只会将连续的元素分组。 - Jochen Ritzel结合set()使用的列表推导式将完全实现您想要的功能。
list(set([i for i in x if x.count(i) >= 2]))
>>> [2,6]
虽然不是很高效,但为了得到输出,你可以尝试:
import numpy as np
def check_for_repeat(check_list):
repeated_list = []
for idx in range(len(check_list)):
elem = check_list[idx]
check_list[idx] = None
if elem in temp_list:
repeated_list.append(elem)
repeated_list = np.array(repeated_list)
return list(np.unique(repeated_list))
保持简单:
array2 = []
aux = 0
aux2=0
for i in x:
aux2 = i
if(aux2==aux):
array2.append(i)
aux= i
list(set(array2))
那应该可以工作
[2,2,6]
吗? - DSM