2016-02-19 167 views
0

我有以下代码。它正在工作,除非我有重复3次或更多次的重复,程序会将该元素视为新号码并显示两次。如何解决这个问题?显示重复项和重复项数

import collections 
mylist = [1,2,3,4,5,5,6,7,7,7,8,9] 
i = 0 
count = 0 


for i in range(len(mylist)): 
    print1 = mylist.count(mylist[i]) 
    if print1 > 1: 

     print("Duplicate Element: " , mylist[i]) 
     print("It is repeated " , print1, "times") 
     mylist.remove(mylist[i]) 
     count += 1 
     i += 1 

我得到的输出是

Duplicate Element: 5 
It is repeated 2 times 
Duplicate Element: 7 
It is repeated 3 times 
Duplicate Element: 7 
It is repeated 2 times 
Traceback (most recent call last): 
    File "C:/Users/sanantha/Documents/Python/Lab6/task3.py", line 10, in <module> 
    print1 = mylist.count(mylist[i]) 
IndexError: list index out of range 

如何解决这一问题?

+2

不要在您循环播放内容的同时修改列表。 'mylist.remove'使得列表缩短,但是你仍然在循环播放原始长度。 –

+0

可能的重复:http://stackoverflow.com/questions/30565759/get-unique-values-in-list-of-lists-in-python –

回答

0

这里是另一种方式,你可以如何进行,使用itertools.groupby

from itertools import groupby 

print(*["Duplicate element: {}. It is repeated {} times." 
     .format(k, len(list(group))) for k, group in groupby(mylist) 
     if len(list(group)) > 1], 
     sep='\n') 

输出:

Duplicate element: 5. It is repeated 2 times. 
Duplicate element: 7. It is repeated 3 times. 
0

使用collections.Counter,它是专为这样的:

from collections import Counter 

mylist = [1,2,3,4,5,5,6,7,7,7,8,9] 
for value, repeats in Counter(mylist).items(): 
    if repeats > 1: 
     print("Value {} repeats {} times".format(value, repeats) 
0

你代码只需要一个修复。以这种方式,最好的方法是使用sets

mylist = [1,2,3,4,5,5,6,7,7,7,8,9] 

for i in set(mylist): 
    count = mylist.count(i) 
    if count > 1: 
     print('Duplicate Element: %i' % i) 
     print('It is repeated %i times' % count) 
+0

OMG谢谢。这工作! – shegiggles

+0

这种方法效率低下:O(n^2)。使用Counter或groupby查看O(n)解决方案的其他答案。 – Oin

+0

他没有说任何关于表演的东西!他只是想修复他的代码! –

0

指数超出范围意味着您要访问的是出的数据结构范围内的元素。

E.g.你有一个数组[1,2,3,4](index:0,1,2,3) - 你在索引1上执行删除操作。 这会给你一个[1,3,4](索引:0,1,2)。现在尝试访问索引3将导致索引超出范围异常,因为它不再存在。