如何在列表推导中添加列表列表

时间:2013-10-27 07:43:51

标签: python python-3.x list-comprehension

我有一个由列表推导生成的列表,它根据组对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答案,因为它效率高且简单

3 个答案:

答案 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的解决方案时,没有两个列表AB的额外串联。您也可以将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', '', '']