在Python中标识列表中的重复值

Hai*_*iro 38 python arrays list

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

我有一个项目列表:

    mylist = [20, 30, 25, 20]
Run Code Online (Sandbox Code Playgroud)

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

是否有可能在python中获得此结果或类似的东西?我试图避免做出一个荒谬的大if elif条件陈述.

Joh*_*ooy 58

这些答案都为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]
Run Code Online (Sandbox Code Playgroud)

如果你需要知道指数,

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}
Run Code Online (Sandbox Code Playgroud)

  • @Lattyware,eww (5认同)
  • 您可以使用更紧凑的`[i for key in(key for key,count in Counter(mylist).items()if count> 1)for i,x in enumerate(mylist)if x == key]` - 虽然它有点像怪物,你可能想要分离出生成器表达式. (2认同)
  • 你可以使`def indices(seq,values):`,`return(i表示i的值,x表示枚举(seq),如果x == value)`,然后执行`indices(mylist,(key for key) ,计数Counter(mylist).items()如果count> 1)`.这非常整洁(当没有塞进评论时). (2认同)

Jun*_*uxx 16

这是一个符合你想要的列表理解.正如@Codemonkey所说,列表从索引0开始,因此重复项的索引是0和3.

>>> [i for i, x in enumerate(mylist) if mylist.count(x) > 1]
[0, 3]
Run Code Online (Sandbox Code Playgroud)

  • 对于那些不理解O(N ^ 2)含义的人:这意味着对于10个元素的列表,你将执行100个步骤,1000个元素1毫升步骤,100万个元素,一百万个步骤等等二次性能会很快破坏你的表现. (13认同)
  • 那是O(n ^ 2)......你可以做得更好. (12认同)
  • @Levon,它会搜索整个列表 (2认同)

小智 10

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

my_list = [3, 5, 2, 1, 4, 4, 1]
opt = [item for item in set(my_list) if my_list.count(item) > 1]
Run Code Online (Sandbox Code Playgroud)


Swi*_*iss 7

以下列表理解将产生重复值:

[x for x in mylist if mylist.count(x) >= 2]
Run Code Online (Sandbox Code Playgroud)

  • @Swiss我不是母语人士,随着时间的推移,我在美国学会了 `[` -> (方)小括号,`(` -> 括号,`{` -> (大括号)..:) (2认同)

小智 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']
Run Code Online (Sandbox Code Playgroud)

并且您还可以列出重复项本身(如示例中可能再次包含重复项):

[z[i] for i in range(len(z)) if not i == z.index(z[i])]
>>>['a', 'b', 'a']
Run Code Online (Sandbox Code Playgroud)

或者他们的索引:

[i for i in range(len(z)) if not i == z.index(z[i])]
>>>[2, 4, 5]
Run Code Online (Sandbox Code Playgroud)

或作为其索引的 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)]
Run Code Online (Sandbox Code Playgroud)

或者这与项目本身一起:

[(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')]
Run Code Online (Sandbox Code Playgroud)

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