2014-11-09 85 views
0

我將如何編碼返回FalseTrue使用for循環等從列表l如果列表重複,如何返回布爾語句?

我應該有一個計數器來計算重複嗎?我想我可以使用點計數符號來計算它們的重複次數。如果它計數超過2,它將返回False

l = [1, 2, 2, 3, 4, 4] 

def allDifferent1D(l): 
    for i in l: 
     print(l.count(i)) 
     if l.count(i) > 1: 
      return False 

眼下這是回訪:

1 
2 
+1

需要考慮的事情:@ Martijn的答案比你的方法快得多。方法count()方法必須在每次調用它時檢查列表中的每個元素來計算元素的數量 - 這意味着對於一個6元素列表,您將檢查整個列表6次,這會增加一些紅旗。 – jayelm 2014-11-09 03:08:26

回答

3

試試這個,它是不需要顯式循環更簡單的方法 - 它使用的事實,即定義一組不允許重複。如果列表和設置有相同數量的元素,這是因爲沒有重複開始與:

def allDifferent1D(lst): 
    return len(lst) == len(set(lst)) 

上述函數將返回False如果有在lst列表重複,True如果所有的元素是唯一的,並且不需要對輸入列表進行排序。例如:

allDifferent1D([1, 2, 2, 3, 4, 4]) 
=> False 
allDifferent1D([1, 2, 3, 4, 5, 6]) 
=> True 
4

保持一個集中的值,並儘快返回False照見一個重複:

def all_different(l): 
    seen = set() 
    for i in l: 
     if i in seen: 
      return False 
     seen.add(i) 
    return True 

簡化是隻創建一個set()去和測試的長度;較短的集合意味着重複。這做更多的工作;對於大型列表,上述方法效率更高,因爲它將短路;一旦找到重複,請立即返回False

請注意,您的計數方法每次掃描整個列表,您創建了一個二次算法;在向列表添加元素時,工作量會相應增加。

+0

二次算法意味着'O(n ** 2)'對嗎? – 2014-11-09 03:12:04

+0

@freeforalltousez:是的;對於'n'元素的列表,每個'.count()'掃描'n'個元素都會進行最多n ** 2次測試。 – 2014-11-09 03:14:13

0

這種方法將產生O(nlogn)comlexity和O(1)空間的解決方案。

當您對列表進行排序時,重複值應該是鄰居,而不使用集合來存儲我們已經看到的項目,我們可以使用O(1) - 空間算法。

當我們對元素進行排序時(假設Python使用最優排序算法),其複雜度爲O(nlogn)。我們遍歷該列表,在最壞的情況下,我們遍歷所有列表O(n)。所以在這種情況下,我們有O(nlogn)複雜度算法。

l = [1,2,2,3,4,4] 

def isDup(l): 
    l=sorted(l) 
    index=0 
    isFound=False 
    while not isFound and index<len(l)-2: 
     if l[index+1]==l[index]: 
      isFound=True 
     else: 
      index+=1 
    return isFound 

print isDup(l) 
0

這裏簡單的一個:

>>> def dup_check(l): 
     return sorted(l) == sorted(set(l)) 

>>> dup_check([1,2,3,8,1]) 
False 
>>> dup_check([1,2,3,8,]) 
True 

set將消除重複,如果列表中有沒有重複的,那麼排序(L)==排序(集(1))將返回True其他False

+1

更簡單的版本是檢查集合的長度:'return len(l) - len(set(l))'。這當然快得多。 – 2014-11-09 03:41:17