2017-04-26 52 views
1

所以我有一個列表:的Python:遍歷目錄並刪除重複(不使用設置())

s = ['cat','dog','cat','mouse','dog'] 

而且我希望能夠通過列表進行迭代並刪除重複的,不使用set()函數!因此,例如它應該刪除'貓'和位置s [2],但保持'貓'在位置s [0]。然後它需要爲'狗'做同樣的事情,即。在位置s [1]保持'狗',但從位置s [4]移除'狗'。

所以輸出則爲:

s = ['cat','dog','mouse'] 

我曾嘗試使用i和j作爲列表索引位置,檢查是否我在位置上的元素等於在位置j的元素。如果是這樣,它將刪除它並將j的值增加1,否則它將離開它並僅增加j的值。整個列表迭代完成後,它將增加i的值,然後再次檢查整個列表,以查找新元素。如下:

i = 0 
j = 1 
for a in range(len(s)): 
    for b in range(len(s)): 
     if s[i] == s[j]: 
      s.remove(s[j]) 
      j = j + 1 
     else: 
      j = j + 1 
    i = i + 1 

我在做什麼錯在這裏?

+0

使用的,而不是==。如果該值不在該數組中,則將它們存儲在一個分段數組中。 –

+1

是否有任何理由需要更新該列表與創建新列表? 'l = []; for e in s:if e not in l:l.append(e)' – AChampion

+2

另一個問題是你遍歷所有索引直到列表的末尾。如果實際上有任何重複項,那麼當您到達那裏時,列表將會縮短,您將得到一個IndexError。 – zondo

回答

2

的問題是「自動」 for循環 - 你必須要小心修改您正在通過迭代時使用它們。以下是適當的解決方案:

def remove_dup(a): 
    i = 0 
    while i < len(a): 
     j = i + 1 
     while j < len(a): 
     if a[i] == a[j]: 
      del a[j] 
     else: 
      j += 1 
     i += 1 

s = ['cat','dog','cat','mouse','dog'] 
remove_dup(s) 
print(s) 

Output: ['cat', 'dog', 'mouse'] 

此解決方案就地修改原始數組而不是創建一個新數組。它也不使用任何額外的數據結構。

+0

謝謝隊友!正在考慮使用while循環,在第一次之後錯過了關於j的部分,而list.remove()只是不適合我!謝謝! –

1

您可以遍歷列表並檢查動物是否已被添加。

s = ['cat','dog','mouse','cat','horse','bird','dog','mouse'] 

sNew = [] 
for animal in s: 
    if animal not in sNew: 
     sNew.append(animal) 

s = sNew 
+0

是否有替代「不在」?我的任務是理解排序算法是如何工作的,所以「不在」是我猜測的一種欺騙行爲。 –

0

我不知道你爲什麼不使用一套,但這裏是一個替代方案。迭代您的原始列表,將每個元素放入新列表中,如果它尚不在新列表中。例如:

l = [] 
s = ['dog', 'cat', 'cat', 'mouse', 'dog'] 

for i in range(len(s)): 
    if s[i] not in l: 
     l.append(s[i]) 

現在:

>>> s 
['dog', 'cat', 'mouse'] 
+1

更多的規範將只是迭代列表's'與指數。 – AChampion

+0

非常真實。它可能會更Pythonic。 –

+0

有沒有替代「不在」?我的任務是理解排序算法是如何工作的,所以「不在」是我猜測的一種欺騙行爲。 –

2

,而你遍歷它不應更改列表中,你可能會要麼跳元素或得到IndexError。如果你只是不能使用set使用collections.OrderedDict

>>> from collections import OrderedDict 

>>> s = ['cat','dog','cat','mouse','dog'] 

>>> list(OrderedDict.fromkeys(s).keys()) 
['cat', 'dog', 'mouse'] 
0

這裏有一個在線解決方案:

s = ['dog', 'cat', 'cat', 'mouse', 'dog'] 

answer = [animal for idx, animal in enumerate(s) if a not in s[:idx]] 

,你會看到:

>>> answer 
['cat', 'dog', 'mouse']