2017-06-01 35 views
1

輸入列表理解的if/else

['27', ' 5', '6', ' 0', ' 0', '', '', '', '','','','','','34','32','','','',''] 

我希望我的輸出是這樣的。邏輯是用單個新物品替換4個連續的重複空串'',同時保留剩餘的物品。

['27', ' 5', '6', ' 0', ' 0', 'LOL','LOL', '34','32','LOL'] 

我很困惑,爲什麼這不僅賦予了輸出

['LOL','LOL','LOL'] 

我的代碼如下:

from itertools import groupby,repeat 
L = ['27', ' 5', '6', ' 0', ' 0', '', '', '', '','','','','','34','32','','','',''] 
grouped_L = [(k, len(list(g))) for k,g in groupby(L)] 

final_list = [z if x=='' else x for x,y in grouped_L for z in repeat('LOL',(y//4)) ] 
print(final_list) 
+1

預期輸出背後的邏輯是什麼?你的代碼失敗,因爲'repeat(...,(y // 4))'將導致* zero *重複任何'y <4',所以左邊的表達式根本不被執行(一個循環超過零的項目不會產生迭代)。 –

+0

「34」和「32」消失在哪裏?爲什麼不連續的「0」,「0」產生一個「LOL」呢? – poke

+0

我的壞人。我忘了編輯它們。抱歉!! – void

回答

2

你的內部循環產生任何結果的任何y < 4

>>> from itertools import repeat 
>>> y = 4 
>>> list(repeat('LOL', y // 4)) 
['LOL'] 
>>> y = 3 
>>> list(repeat('LOL', y // 4)) 
[] 

With no迭代,沒有什麼會被添加到結果列表中。

您需要使用不同的策略;你需要包括LOL團體與長度y 4及以上,以及一切用原來的,並始終重複:

[value 
for x, y in grouped_L 
for value in repeat(x if y < 4 else 'LOL', y if y < 4 else y // 4)] 

因此上述兩種包括x * yy < 4,否則」包括'LOL' * (y // 4)其他任何東西:

>>> [value 
... for x, y in grouped_L 
... for value in repeat(x if y < 4 else 'LOL', y if y < 4 else y // 4)] 
['27', ' 5', '6', ' 0', ' 0', 'LOL', '34', '32', 'LOL'] 
+0

這正是我需要的。謝謝:) – void

1

沒有列表解析,但恕我直言,這是一個更容易的解決方案。

a = ['27', ' 5', '6', ' 0', ' 0', 'LOL', '34','32','LOL'] 

def remove_duplicates(w_duplicates): 
    wo_duplicates = [] 
    for el in w_duplicates: 
     if wo_duplicates and el == wo_duplicates[-1]: 
      continue 
     wo_duplicates.append(el) 
    return wo_duplicates 

print remove_duplicates(a) 
+0

不錯,我發現解決方案沒有列表理解。但列表理解是我正在尋找的。 – void