2017-06-01 39 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