我有一个由列表推导生成的列表,它根据组对stripped
中的数据进行排序,查找哪些字符串的长度为3,并且我想合并它们以便在单个列表中与单长度字符串分开。
stripped = ['a,b', 'c,d', 'e', '', 'f,g', 'h', '', '']
lst = [[i.split(',')] if len(i) is 3 else i for i in stripped]
print(lst)
#[[['a', 'b']], [['c', 'd']], 'e', '', [['f', 'g']], 'h', '', '']
我想生成[[['a', 'b'], ['c', 'd'],['f', 'g']], 'e', '','h', '', '']
而不是
如果可能,如何通过单一列表理解来实现这一目标?
接受@HennyH's答案,因为它效率高且简单
答案 0 :(得分:4)
l = [[]]
for e in stripped:
(l[0] if len(e) == 3 else l).append(e)
>>>
[['a,b', 'c,d', 'f,g'], 'e', '', 'h', '', '']
或者匹配3个长字符串的OP输出:
for e in stripped:
l[0].append(e.split(',')) if len(e) == 3 else l.append(e)
>>>
[[['a', 'b'], ['c', 'd'], ['f', 'g']], 'e', '', 'h', '', '']
这样,在提供Inbar的解决方案时,没有两个列表A
,B
的额外串联。您也可以将stripped
转换为生成器表达式,这样就不需要将两个列表保存在内存中。
答案 1 :(得分:2)
使用两个列表推导:
>>> stripped = ['a,b', 'c,d', 'e', '', 'f,g', 'h', '', '']
>>> first = [x.split(',') for x in (item for item in stripped if len(item) == 3)]
>>> second = [item for item in stripped if len(item) != 3]
>>> [first] + second
[[['a', 'b'], ['c', 'd'], ['f', 'g']], 'e', '', 'h', '', '']
答案 2 :(得分:2)
为什么需要列表理解?最好一次通过。
stripped = ['a,b', 'c,d', 'e', '', 'f,g', 'h', '', '']
groups = []
final = [groups]
for item in stripped:
if len(item) == 3:
groups.append(item.split(','))
else:
final.append(item)
结果:
>>> print(final)
[[['a', 'b'], ['c', 'd'], ['f', 'g']], 'e', '', 'h', '', '']