45

是否可以使用 python 获取列表中重复的值?

我有一个项目清单:

    mylist = [20, 30, 25, 20]

我知道删除重复项的最佳方法是set(mylist),但是否有可能知道哪些值被重复?如您所见,在此列表中,重复项是第一个和最后一个值。[0, 3].

是否有可能在 python 中得到这个结果或类似的东西?我试图避免做出一个可笑的大if elif条件语句。

4

14 回答 14

68

这些答案是 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}
于 2012-06-27T23:11:21.200 回答
20

这是一个列表理解,可以满足您的需求。正如@Codemonkey 所说,列表从索引 0 开始,因此重复项的索引是 0 和 3。

>>> [i for i, x in enumerate(mylist) if mylist.count(x) > 1]
[0, 3]
于 2012-06-27T23:11:35.793 回答
5

以下列表推导将产生重复值:

[x for x in mylist if mylist.count(x) >= 2]
于 2012-06-27T23:13:03.467 回答
5

您可以使用列表压缩和设置来降低复杂性。

my_list = [3, 5, 2, 1, 4, 4, 1]
opt = [item for item in set(my_list) if my_list.count(item) > 1]
于 2015-11-07T17:52:19.813 回答
5

使用 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')]

或元素和索引的任何其他组合....

于 2016-07-21T13:01:38.783 回答
3

我尝试下面的代码从列表中查找重复值

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, '一个']

现在获取重复元素的所有索引

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]), ('一', [3, 7])]

希望这可以帮助某人

于 2017-01-03T10:30:57.173 回答
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'
于 2013-12-13T15:37:10.680 回答
2

以下代码将使用重复项及其索引值获取您想要的结果。

  for i in set(mylist):
    if mylist.count(i) > 1:
         print(i, mylist.index(i))
于 2017-03-29T22:05:28.467 回答
0

您应该对列表进行排序:

mylist.sort()

在此之后,像这样遍历它:

doubles = []
for i, elem in enumerate(mylist):
    if i != 0:
        if elem == old:
            doubles.append(elem)
            old = None
            continue
    old = elem
于 2012-06-27T23:13:52.627 回答
0

您可以使用以下逻辑使用列表打印重复和 Unqiue。

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)
于 2019-08-06T22:25:37.127 回答
0
mylist = [20, 30, 25, 20]

kl = {i: mylist.count(i) for i in mylist if mylist.count(i) > 1 }

print(kl)
于 2020-09-21T06:27:51.883 回答
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)
于 2021-02-25T06:53:22.510 回答
-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)

然而,这有一些可以改进的冗余。

于 2014-04-09T07:53:15.657 回答
-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]))
于 2021-02-25T06:36:20.300 回答