我想知道是否有一条快捷方式可以在Python列表中列出一个简单的列表.
我可以在for循环中做到这一点,但也许有一些很酷的"单行"?我用reduce尝试了,但是我收到了一个错误.
码
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
reduce(lambda x, y: x.extend(y), l)
Run Code Online (Sandbox Code Playgroud)
错误信息
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'extend'
Run Code Online (Sandbox Code Playgroud) 我想知道如何完全展平列表和包含它们的东西.除此之外,我想出了这个解决方案,它可以滑动具有多个元素的东西并将它们放回去,或者在滑动之后用一个元素取出它.
这与我如何"压扁"perl 6中的列表列表略有不同?,这是完全平坦的,因为任务是重组.
但是,也许有更好的方法.
my @a = 'a', ('b', 'c' );
my @b = ('d',), 'e', 'f', @a;
my @c = 'x', $( 'y', 'z' ), 'w';
my @ab = @a, @b, @c;
say "ab: ", @ab;
my @f = @ab;
@f = gather {
while @f {
@f[0].elems == 1 ??
take @f.shift.Slip
!!
@f.unshift( @f.shift.Slip )
}
}
say "f: ", @f;
Run Code Online (Sandbox Code Playgroud)
这给出了:
ab: [[a (b c)] [(d) e f [a (b c)]] [x …Run Code Online (Sandbox Code Playgroud) 我在这里回答了几个问题,用它来"压扁"列表列表:
>>> l = [[1,2,3],[4,5,6],[7,8,9]]
>>> sum(l,[])
Run Code Online (Sandbox Code Playgroud)
它工作正常,产量:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
虽然我被告知sum操作员做a = a + b的不是那么高效itertools.chain
我计划的问题是"为什么它可以在字符串上阻止字符串",但我在我的机器上做了一个快速的基准测试比较sum和itertools.chain.from_iterable相同的数据:
import itertools,timeit
print(timeit.timeit("sum(l,[])",setup='l = [[1,2,3],[4,5,6],[7,8,9]]'))
print(timeit.timeit("list(itertools.chain.from_iterable(l))",setup='l = [[1,2,3],[4,5,6],[7,8,9]]'))
Run Code Online (Sandbox Code Playgroud)
我这样做了几次,我总是得到与下面相同的数字:
0.7155522836070246
0.9883352857722025
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,chain- sum在我的答案的几条评论中,每个人推荐列表 - 速度要慢得多.
在循环中迭代时仍然很有趣,for因为它实际上并不创建列表,但是在创建列表时,sum获胜.
那么当预期结果是什么时我们应该放弃itertools.chain并使用?sumlist
编辑:感谢一些评论,我通过增加列表数量进行了另一项测试
s = 'l = [[4,5,6] for _ in range(20)]'
print(timeit.timeit("sum(l,[])",setup=s))
print(timeit.timeit("list(itertools.chain.from_iterable(l))",setup=s))
Run Code Online (Sandbox Code Playgroud)
现在我反其道而行之:
6.479897810702537
3.793455760814343
Run Code Online (Sandbox Code Playgroud)