2016-02-19 151 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將導致索引超出範圍異常,因爲它不再存在。