是否可以使用python在列表中获取哪些值是重复的?
我有一个项目列表:
mylist = [20, 30, 25, 20]
我知道删除重复项的最佳方法是set(mylist)
,但是有可能知道重复的值是什么吗?如您所见,在此列表中,重复项是第一个和最后一个值。 [0, 3]
。
是否有可能在python中获得此结果或类似内容?我试图避免制作一个可笑的大if elif
条件语句。
答案 0 :(得分:54)
这些答案是O(n),所以代码多于使用mylist.count()
,但效率更高mylist
更长
如果您只想知道重复项,请使用collections.Counter
from collections import Counter
mylist = [20, 30, 25, 20]
[k for k,v in Counter(mylist).items() if v>1]
如果您需要知道指数,
from collections import defaultdict
D = defaultdict(list)
for i,item in enumerate(mylist):
D[item].append(i)
D = {k:v for k,v in D.items() if len(v)>1}
答案 1 :(得分:16)
这是一个符合你想要的列表理解。正如@Codemonkey所说,列表从索引0开始,因此重复项的索引是0和3。
>>> [i for i, x in enumerate(mylist) if mylist.count(x) > 1]
[0, 3]
答案 2 :(得分:4)
使用list.index()时没有任何中间列表的最简单方法:
z = ['a', 'b', 'a', 'c', 'b', 'a', ]
[z[i] for i in range(len(z)) if i == z.index(z[i])]
>>>['a', 'b', 'c']
并且您还可以列出重复项本身(可能会再次包含重复项,如示例所示):
[z[i] for i in range(len(z)) if not i == z.index(z[i])]
>>>['a', 'b', 'a']
或他们的索引:
[i for i in range(len(z)) if not i == z.index(z[i])]
>>>[2, 4, 5]
或重复项作为其索引的2元组列表(仅参考它们的第一次出现),原始问题的答案是什么!!! :
[(i,z.index(z[i])) for i in range(len(z)) if not i == z.index(z[i])]
>>>[(2, 0), (4, 1), (5, 0)]
或与项目本身一起:
[(i,z.index(z[i]),z[i]) for i in range(len(z)) if not i == z.index(z[i])]
>>>[(2, 0, 'a'), (4, 1, 'b'), (5, 0, 'a')]
或元素和指数的任何其他组合......
答案 3 :(得分:3)
您可以使用列表压缩和设置来降低复杂性。
my_list = [3, 5, 2, 1, 4, 4, 1]
opt = [item for item in set(my_list) if my_list.count(item) > 1]
答案 4 :(得分:2)
这是我在列表中查找重复项的最简单方法:
my_list = [3, 5, 2, 1, 4, 4, 1]
my_list.sort()
for i in range(0,len(my_list)-1):
if my_list[i] == my_list[i+1]:
print str(my_list[i]) + ' is a duplicate'
答案 5 :(得分:2)
我在下面的代码中尝试从列表
中查找重复值1)创建一组重复列表
2)通过查看重复列表来迭代。
glist=[1, 2, 3, "one", 5, 6, 1, "one"]
x=set(glist)
dup=[]
for c in x:
if(glist.count(c)>1):
dup.append(c)
print(dup)
<强>输出强>
[1,&#39; one&#39;]
现在获取重复元素的所有索引
glist=[1, 2, 3, "one", 5, 6, 1, "one"]
x=set(glist)
dup=[]
for c in x:
if(glist.count(c)>1):
indices = [i for i, x in enumerate(glist) if x == c]
dup.append((c,indices))
print(dup)
<强>输出强>
[(1,[0,6]),(&#39; one&#39;,[3,7])]
希望这有助于某人
答案 6 :(得分:2)
以下代码将使用重复项及其索引值来获取所需结果。
for i in set(mylist):
if mylist.count(i) > 1:
print(i, mylist.index(i))
答案 7 :(得分:1)
以下列表推导将产生重复值:
[x for x in mylist if mylist.count(x) >= 2]
答案 8 :(得分:0)
您应该对列表进行排序:
mylist.sort()
在此之后,像这样迭代它:
doubles = []
for i, elem in enumerate(mylist):
if i != 0:
if elem == old:
doubles.append(elem)
old = None
continue
old = elem
答案 9 :(得分:0)
您可以使用列表中的以下逻辑来打印重复和取消排队的内容。
def dup(x):
duplicate = []
unique = []
for i in x:
if i in unique:
duplicate.append(i)
else:
unique.append(i)
print("Duplicate values: ",duplicate)
print("Unique Values: ",unique)
list1 = [1, 2, 1, 3, 2, 5]
dup(list1)
答案 10 :(得分:0)
mylist = [20,30,25,20]
kl = {i:如果mylist.count(i)> 1},则表示mylist中的i
print(kl)
答案 11 :(得分:0)
看起来您想要重复项的索引。下面是一些简短的代码,可以在 O(n) 时间内找到它们,而无需使用任何包:
dups = {}
[dups.setdefault(v, []).append(i) for i, v in enumerate(mylist)]
dups = {k: v for k, v in dups.items() if len(v) > 1}
# dups now has keys for all the duplicate values
# and a list of matching indices for each
# The second line produces an unused list.
# It could be replaced with this:
for i, v in enumerate(mylist):
dups.setdefault(v, []).append(i)
答案 12 :(得分:-2)
m = len(mylist)
for index,value in enumerate(mylist):
for i in xrange(1,m):
if(index != i):
if (L[i] == L[index]):
print "Location %d and location %d has same list-entry: %r" % (index,i,value)
然而,这有一些可以改进的冗余。
答案 13 :(得分:-2)
def checkduplicate(lists):
a = []
for i in lists:
if i in a:
pass
else:
a.append(i)
return i
print(checkduplicate([1,9,78,989,2,2,3,6,8]))