2016-03-04 93 views
-1

如果我在Python中爲[1,1,2,2,2,3,3,5,5,5]這樣的列表提供了一個列表,並且希望刪除選擇連續編號分組的第一個重複,然後中斷並重復/遞歸以從第二個分組等中刪除第一個重複...我該怎麼做?舉例如下:如果在列表的子列表中出現兩次,則刪除重複元素

分解:一旦代碼檢測到alist [0]和alist [1]中的第一個重複對數ie1,1,它將刪除alist [1]並通過跳過其餘重複的次數分組。然後,它會遞歸地回憶起自己。 SKIPS alist [0]和alist [1]這次遍歷列表,並找到alist [2],alist [3]重複,刪除alist [3],發生並重復......最終導致四個不同的輸出

alist = [1,1,2,2,2,3,3,5,5,5] 
# insert code here" 
>>output = 
[1,2,2,2,3,3,5,5,5] 
[1,1,2,2,3,3,5,5,5] 
[1,1,2,2,2,3,5,5,5] 
[1,1,2,2,2,3,3,5,5] 
+0

看一看'itertools.groupby'。 –

+5

不確定你的意思。請編輯以提供更多細節。 – sabbahillel

回答

2

使用itertools.groupby

>>> from itertools import chain, groupby 
>>> alist = [1, 1, 2, 2, 2, 3, 3, 5, 5, 5] 
>>> groups = [list(g) for _, g in groupby(alist)] 
>>> for i, g in enumerate(groups): 
     print list(chain.from_iterable(groups[:i] + [g[1:]] + groups[i+1:])) 
... 
[1, 2, 2, 2, 3, 3, 5, 5, 5] 
[1, 1, 2, 2, 3, 3, 5, 5, 5] 
[1, 1, 2, 2, 2, 3, 5, 5, 5] 
[1, 1, 2, 2, 2, 3, 3, 5, 5] 

這裏groups是包含所有組列表的列表:

>>> groups 
[[1, 1], [2, 2, 2], [3, 3], [5, 5, 5]] 

現在我們可以遍歷這個列表,並切出的第一個項目從當前組g中加入,並使用切片和itertools.chain.from_iterable將其與其餘組加入。

+0

謝謝!這很棒! –

+0

請注意,這可以殺死列表中的唯一項目。但我想這對於OP的目的可能是好的,當然如果這些項目總是至少有一次重複,這當然不成問題。 –

0

不使用遞歸的配方,你可以爲了使用itertools.groupby()到組重複的項目,然後消耗的第一項和itertools.chain.from_iterable()串連休息:

>>> def del_group(iterator): 
...  for _,g in groupby(iterator): 
...   next(g) 
...   yield g 
... 
>>> 
>>> list(chain.from_iterable(del_group(alist))) 
[1, 2, 2, 3, 5, 5] 

但是,如果你想所有刪除結果都可以使用以下功能:

>>> def del_group(iterator): 
...  groups = [list(g) for _,g in groupby(iterator)] 
...  for i in range(len(groups)): 
...   yield [item[1:] if ind == i else item for ind, item in enumerate(groups)] 
... 
>>> list(del_group(alist)) 
[[[1], [2, 2, 2], [3, 3], [5, 5, 5]], 
[[1, 1], [2, 2], [3, 3], [5, 5, 5]], 
[[1, 1], [2, 2, 2], [3], [5, 5, 5]], 
[[1, 1], [2, 2, 2], [3, 3], [5, 5]]] 
0

對於列表中的每個唯一元素,刪除列表中的第一個實例。 爲每次迭代使用原始列表的全新副本。

import copy 

alist = [1,1,2,2,2,3,3,5,5,5] 

for item in set(alist): 
    temp = copy.copy(alist) 
    temp.remove(item) 
    print temp 
+0

您可能需要將設置轉換回列表並對其進行排序。 – slider

+0

如果列表看起來像'alist = [1,1,2,2,2,3,3,5,5,5,1,1,1]'?您應該使用不使用值的索引移除項目。 –

相關問題