2015-10-13 39 views
2

我正在做一些Google Python Class練習,我試圖找到pythonic解決方案以下問題。使用列表解析使funcion更pythonic

D.鑑於號碼的列表,其中,返回所有相鄰== 元件已被減少爲單個元件的列表,所以[1,2,2,3] 返回[1,2,3 ]。您可以創建一個新列表或修改傳入的 列表。

我的嘗試,這是工作完美如下:

def remove_adjacent(nums): 
    result = [] 
    for num in nums: 
    if len(result) == 0 or num != result[-1]: 
     result.append(num) 
    return result 

例如,remove_adjacent([2, 2, 3, 3, 3])輸出[2, 3]。一切都好。

我試圖使用列表理解爲了更Python的方式archieve這一點,所以我嘗試如下:

def remove_adjacent(nums): 
    result = [] 
    result = [num for num in nums if (len(result)==0 or num!=result[-1])] 
    return result 

這與相同的輸入[2, 2, 3, 3, 3],輸出[2, 2, 3, 3, 3](相同)。 Meeeh!錯誤。

我在做什麼錯了列表解析?我是否試圖做一些與列表解析無關的事情?我知道初始化列表(result = [])有點奇怪,所以在這種情況下使用列表解析可能無法做到這一點。

+0

就像一個fyi列表(set([2,2,3,3,3]))'將返回'[2,3]'。但是,這隻會將列表減少爲唯一的一組值。它不一定刪除相鄰的重複項。 – KronoS

+0

你從哪裏得到'res' varoraiable – The6thSense

+1

也'res'應該'result' – KronoS

回答

11

我想做一些不可能用列表解析的東西嗎?

是的。列表理解不能通過名稱來引用自身,因爲在理解完全完成評估之前,變量根本不會被綁定。這就是爲什麼如果你的第二個代碼塊中沒有result = [],你會得到一個NameError

如果不是作弊使用的標準模塊,考慮在你使用列表中groupby組合到一起類似的價值觀:

>>> import itertools 
>>> seq = [1, 2, 2, 3] 
>>> [k for k,v in itertools.groupby(seq)] 
[1, 2, 3] 
>>> seq = [2,2,3,3,3] 
>>> [k for k,v in itertools.groupby(seq)] 
[2, 3] 
2

對於學習的緣故,我建議使用核心reduce功能:

def remove_adjacent(lst): 
    return reduce(lambda x, y: x+[y] if not x or x[-1] != y else x, lst, [])