2013-04-22 202 views
2

我很好奇如何檢查列表中的2個數字是否相同。例如,如何檢查列表中的兩個數字是否相同

myList=[1,7,9,3,1,2,8] 

在這種情況下, 「1」 被重複 'myList中'。

我怎麼會讓一個程序,檢查,看看是否列表內的兩個數字是相同的(重複)。嘗試使用循環,所以我可以理解,因爲我還沒有學會複雜的功能。

+3

-1完全缺乏研究工作,並且不包括你試過什麼。 – Adam 2013-04-22 20:27:21

回答

5

如果你想使用循環,你必須使用你已經看到的一個列表或一組數字。然後在循環時,您將檢查,如果號碼已被查看,則使用in運算符。

seen = [] 
for number in myList: 
    if number in seen: 
     print "Number repeated!" 
    else: 
     seen.append(number) 

set不允許在它的重複,因此這是一個非常適合這種算法的。正如評論中提到的那樣,檢查一個元素是否在一個集合中的時間複雜度對於平均情況(O(1))是不變的,所以如果你有很多數字,這個效率會更高。

seen = set() 
for number in myList: 
    if number in seen: 
     print "Number repeated!" 
    seen.add(number) # won't duplicate 

我會說,最Python的方式是使用collections.Counter,但其他的答案涵蓋這已經。要使用內置的,您可以使用generator expressionset來生成一組出現多次的數字。

In [39]: seen = set() 

In [40]: print list(set(x for x in myList if x in seen or seen.add(x))) 
[1] 

這裏表達將循環遍歷所有myList值,並將其添加到一個名爲seenset如果他們已經看到。最終,它會將結果集轉換爲列表並打印內容。

+2

在一個理想的世界裏,你將會看到一個集合而不是一個列表,但這個想法保持不變。 – arshajii 2013-04-22 20:24:23

+0

這是真的,我會更新它。謝謝 – msvalkon 2013-04-22 20:26:01

+1

我認爲使用set的主要優點並不在於它不允許重複,而是會員測試 - 「if in number in seen:」非常快。如果'seen'是一個列表,那麼爲了確保一個值不存在,它必須遍歷整個列表(O(n))。測試一個值是否在一個集合中是〜O(1)。 – DSM 2013-04-22 20:44:00

1

你可以改變列表爲一組

myset = set(mylist) 

,並檢查長度是不同的。如果是這樣,那麼重複。

這是因爲一組conains每個元素只有一次,如果多個元素都是平等的 - 就像套在數學意義。

這是最簡單的方法,如果你不需要知道其中號碼是重複的。

+0

+1非常有趣,但你可能想解釋它是如何工作的(轉換設置唯一化),因爲用戶似乎是Python的新手。 – 2013-04-22 20:23:21

2

您可以使用內置的set()功能,集不能有重複的列表轉換爲一個集。因此,如果「設置」和「列表」的大小不同,則「列表」會有重複。

if len(myList) != len(set(myList)): 
    print "duplicates" 

這假定你不關心重複是什麼,你只想知道是否存在一個或多個重複。

9

使用collections.Counter

from collections import Counter 

myList = [1, 7, 9, 3, 1, 2, 8] 
counter = Counter(myList) 
print(counter) # prints 'Counter({1: 2, 2: 1, 3: 1, 7: 1, 8: 1, 9: 1})' 

隨着Collections.Counter,你知道多少次重複源列表myList的每一個元素。

之後,你可以用一個簡單的list comprehension知道哪些是重複的元素:

result = [i for i, j in counter.items() if j > 1] 
print(result) # prints '[1]' 
+1

OP想要for-loops。 – 2013-04-22 20:23:09

+4

@ Ashwini Chaudhary:他說過「試圖使用循環,因爲我沒有學習複雜的功能」。我不認爲使用'collections.Counter'是複雜的:) – 2013-04-22 20:25:14

+0

+1大量使用超鏈接學習高級Python概念。 – 2013-04-22 20:37:32

1
myList=[1,7,9,3,1,2,8] 
counts = {elem:myList.count(elem) for elem in set(myList)} 
for i in counts: 
    if counts[i] > 1: 
     print '{} occurs more than once'.format(i) 

如果你不想使用字典理解:

myList=[1,7,9,3,1,2,8] 
counts = {} 
for elem in set(myList): 
    counts[elem] = myList.count(elem) 
    if counts[elem] > 1: 
     print '{} occurs more than once'.format(i) 
1

也許不是最容易理解,但這是我如何做到的。

seen = set() 
duplicated = [t for t in my_list if t in seen or seen.add(t)] 

它等同於(而且更容易理解)

duplicated = [] 
seen = set() 
for elem in my_list: 
    if elem in seen: 
     duplicated.append(elem) 
    else: 
     seen.add(elem) 
相關問題