相关疑难解决方法(0)

如何从列表列表中制作一个平面列表?

我想知道是否有一条快捷方式可以在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)

python list flatten multidimensional-array

2950
推荐指数
29
解决办法
184万
查看次数

如何完全展平Perl 6列表(列表列表)...)

我想知道如何完全展平列表和包含它们的东西.除此之外,我想出了这个解决方案,它可以滑动具有多个元素的东西并将它们放回去,或者在滑动之后用一个元素取出它.

这与我如何"压扁"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)

list flatten perl6 raku

17
推荐指数
2
解决办法
560
查看次数

为什么列表上的总和(有时)比itertools.chain更快?

我在这里回答了几个问题,用它来"压扁"列表列表:

>>> 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

我计划的问题是"为什么它可以在字符串上阻止字符串",但我在我的机器上做了一个快速的基准测试比较sumitertools.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)

python list

5
推荐指数
2
解决办法
680
查看次数

标签 统计

list ×3

flatten ×2

python ×2

multidimensional-array ×1

perl6 ×1

raku ×1