簡體   English   中英

Python,從列表中刪除重復項

[英]Python, removing duplicates from a list

我想Pythonic的方法是使用我剛學過的set。 在學習set之前,我嘗試了以下無效的方法。 有人可以解釋這是怎么回事嗎? 我收到索引超出范圍的錯誤,但是我認為代碼在編寫時永遠不會超出列表的索引范圍。 請解釋發生了什么。

#!/usr/bin/python
# Remove dupes from a list
def Uniq_list(x):
  for elem in range(len(x)):
    if ( elem == 0 ):
      next
    else:
      if (x[elem] == x[(elem - 1)]):
        x.pop(index(x[elem])
  return x

mylist = ['1', '1', '2', '1', '3', '2']

print Uniq_list(mylist)

for循環僅生成一次range()對象,但是在循環中,您將從列表中刪除元素,使其更短。

這導致了另一個問題:您將跳過元素。 如果刪除元素1,則其后的所有元素將上移一個位置; 元素2現在是元素1,依此類推。但是您的循環永遠不會考慮到這一點,因此它將跳過現在從位置2移到位置1的元素。

由於您僅使用前面的元素來測試集合成員資格,這一事實使情況更加復雜。 跳過的元素突然是正在測試另一個值的值。 它們可能會有所不同,但這並不意味着早期的元素將不相等。

進一步的問題:您在代碼中使用了一個未命名的index()函數,這意味着我們無法驗證它的作用。 如果它像list.index()方法一樣工作, list.index()從列表對象中刪除第一次出現的值。 這可能有效,但是您已經有了elem作為列表的索引,為什么還要再次搜索呢?

它自己的行上的next條目只是對next()函數的引用,而無需調用它。 因此,這是無人操作。 您可能打算在此處使用continue語句

一個更簡單的版本是:

for i in range(len(x), -1, -1):
    if x[i] in x[:i]:
        del x

例如,從列表末尾開始,如果當前元素在列表中此位置之前 ,則將其刪除。 但是,使用集合仍然會更加有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM