2016-08-30 122 views
1

如何在python中從這樣的列表中刪除連續的重複項?如何從列表中刪除連續的重複項?

lst = [1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5] 

擁有一個唯一的列表或集合不會解決問題,因爲在前面的列表中有一些重複的值,如1,...,1。

我想要的結果是這樣的:

newlst = [1,2,4,1,3,5] 

你也請考慮當我有這樣 [4, 4, 4, 4, 2, 2, 3, 3, 3, 3, 3, 3] 列表和我想要的結果是[4,2,3,3] 而非[4,2,3]

+7

你是什麼意思的崩潰? – neverendingqs

+5

看看'itertools.groupby' – MaxU

+0

你在問一個工具或實現嗎?如果你想自己編寫它,你可以遍歷並保留任何不匹配元素的元素。 –

回答

8

itertools.groupby()是您的解決方案。

newlst = [k for k, g in itertools.groupby(lst)] 

如果希望組和限制由該項的值的組的大小,這意味着8 4的將是[4,4],和9 3的將是[3,3,3]這裏是2個選項,做它:

import itertools 

def special_groupby(iterable): 
    last_element = 0 
    count = 0 
    state = False 
    def key_func(x): 
     nonlocal last_element 
     nonlocal count 
     nonlocal state 
     if last_element != x or x >= count: 
      last_element = x 
      count = 1 
      state = not state 
     else: 
      count += 1 
     return state 
    return [next(g) for k, g in itertools.groupby(iterable, key=key_func)] 

special_groupby(lst) 

OR

def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return itertools.zip_longest(*args, fillvalue=fillvalue) 

newlst = list(itertools.chain.from_iterable(next(zip(*grouper(g, k))) for k, g in itertools.groupby(lst))) 

您可以選擇自己認爲合適的。兩種方法都適用於數字> 0.

+0

它工作得很好,但有了這樣一個列表[4,4,4,4,2,2,3,3,3,3,3,3],我想結果是[4,2,3 ,3]而不是[4,2,3]。你能指導我解決這個問題嗎? – Elmahy

+0

@ahmedmar爲什麼會有'[4,2,3,3]'? '[4,2,3]'在這種情況下是正確的輸出。你想刪除重複的東西,而且兩者之間沒有任何關係。 – Bharel

+0

有沒有辦法指定itertools的限制來按它對列表進行分組。即我希望每3,3,3爲3,每4,4,4,4爲4? – Elmahy

0

您可能需要這樣的東西。

lst = [1, 1, 2, 2, 2, 2, 3, 3, 4, 1, 2] 
prev_value = None 
for number in lst[:]: # the : means we're slicing it, making a copy in other words 
    if number == prev_value: 
     lst.remove(number) 
    else: 
     prev_value = number 

所以,我們正在經歷的列表,如果是一樣的前一個數字,我們從列表中刪除它,否則,我們更新了以前的號碼。

可能有一個更簡潔的方式,但這是對我來說最明顯的方式。

HTH。

+0

可能更好地構建新列表,因爲從for循環中的列表中刪除項目可能會導致問題 –

+0

我們這樣做。我們正在遍歷列表的一個切片副本,而不是原始列表。因此,在我們迭代的時候,不會因爲刪除而導致自己被刪除。 –

+0

我錯過了...對不起! –

0
newlist=[]  
prev=lst[0] 
newlist.append(prev) 
    for each in lst[:1]: #to skip 1st lst[0] 
     if(each!=prev): 
      newlist.append(each) 
     prev=each    
+1

儘管此代碼可能會回答問題,但提供有關此代碼爲何和/或如何回答此問題的其他上下文可提高其長期價值。不鼓勵使用僅有代碼的答案。 – Ajean

2

如果你想使用itertools方法@MaxU建議,一個可能的代碼實現:

import itertools as it 

lst=[1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5] 

unique_lst = [i[0] for i in it.groupby(lst)] 

print(unique_lst) 
0
st = [''] 
[st.append(a) for a in [1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5] if a != st[-1]] 
print(st[1:]) 
+0

雖然這段代碼可能會回答這個問題,但提供關於此代碼爲什麼和/或如何回答問題的其他上下文會提高其長期價值。不鼓勵使用僅有代碼的答案。 – Ajean

0

檢查下一個元素總是不等於項目。如果這樣追加。

lst = [1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5] 

new_item = lst[0] 
new_list = [lst[0]] 
for l in lst: 
    if new_item != l: 
    new_list.append(l) 
    new_item = l 

print new_list 
print lst 
2
list1 = ['a', 'a', 'a', 'b', 'b' , 'a', 'f', 'c', 'a','a'] 
temp_list = [] 


for item in list1: 
    if len(temp_list) == 0: 
     temp_list.append(item) 

    elif len(temp_list) > 0: 
     if temp_list[-1] != item: 
      temp_list.append(item) 

print(temp_list) 
  1. 從主列表(列表1)獲取的每個項目。
  2. 如果'temp_list'爲空,請添加該項目。
  3. 如果不是,請檢查temp_list中的最後一項是否爲 ,與我們從「list1」中取出的項目是否相同。
  4. 如果項目不同,則追加到temp_list中。