1

我有一个由列表理解生成的列表,它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的回答,因为它的高效和简单

4

3 回答 3

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', '', '']

这样就没有两个列表的额外连接AB正如 Inbar 的解决方案所提供的那样。你也可以stripped变成一个生成器表达式,这样你就不需要在内存中保存这两个列表。

于 2013-10-27T08:04:59.557 回答
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', '', '']
于 2013-10-27T07:53:42.730 回答
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', '', '']
于 2013-10-27T07:49:28.360 回答