Python 如果子列表长度相同,则展开列表

Python 如果子列表长度相同,则展开列表,python,python-2.7,flatten,Python,Python 2.7,Flatten,我有一个列表,比如[[1,2],[3,4],[5,6],[7,8],[9,10]。我想得到[1,2,3,4,5,6,7,8,9,10] 提供了一些非常好的平展列表的选项。这里给出的答案适用于可变长度的子列表。但在这里,我知道每个子列表都有相同的长度(特别是长度2) 我想知道是否有可能利用齐次子列表长度来改进我所链接的问题中给出的答案。特别是,有什么比[子列表中的项目在l中对应于子列表中的项目]更能压平此列表 编辑:我所说的“更好”,是指对于一个很长的列表来说更快 编辑: 有一件事我没有提到——我

我有一个列表,比如
[[1,2],[3,4],[5,6],[7,8],[9,10]
。我想得到
[1,2,3,4,5,6,7,8,9,10]

提供了一些非常好的平展列表的选项。这里给出的答案适用于可变长度的子列表。但在这里,我知道每个子列表都有相同的长度(特别是长度2)


我想知道是否有可能利用齐次子列表长度来改进我所链接的问题中给出的答案。特别是,有什么比
[子列表中的项目在l中对应于子列表中的项目]
更能压平此列表

编辑:我所说的“更好”,是指对于一个很长的列表来说更快

编辑:

有一件事我没有提到——我不关心扁平列表的顺序(但我关心多重性)

产出

0.13874912262
0.103307008743
0.10813999176
我的
zip
功能能否更快完成

import itertools
a = [[1,2], [3,4], [5,6], [7,8], [9,10]]
list(itertools.chain.from_iterable(a))
输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
现在比较一下这里的时间安排:对于小列表

>>> timeit.timeit("list(itertools.chain.from_iterable(a))",setup='import itertools;a = [[1,2], [3,4], [5,6], [7,8], [9,10]]') 
0.9853601455688477
>>> timeit.timeit("[ y for x in a for y in x]",setup='a = [[1,2], [3,4], [5,6], [7,8], [9,10]]') 
0.9124641418457031
对于大型列表:

下面是首选迭代器的原因:

>>> timeit.timeit("list(itertools.chain.from_iterable(a))",setup='import itertools;a = zip(range(100),range(100))',number=1000000) 
8.213459014892578
>>> timeit.timeit("[ y for x in a for y in x]",setup='a=zip(range(100),range(100))',number=1000000) 
12.833590984344482
对于小列表,
列表理解
很好,但对于大列表,您需要使用
迭代器

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
现在比较一下这里的时间安排:对于小列表

>>> timeit.timeit("list(itertools.chain.from_iterable(a))",setup='import itertools;a = [[1,2], [3,4], [5,6], [7,8], [9,10]]') 
0.9853601455688477
>>> timeit.timeit("[ y for x in a for y in x]",setup='a = [[1,2], [3,4], [5,6], [7,8], [9,10]]') 
0.9124641418457031
对于大型列表:

下面是首选迭代器的原因:

>>> timeit.timeit("list(itertools.chain.from_iterable(a))",setup='import itertools;a = zip(range(100),range(100))',number=1000000) 
8.213459014892578
>>> timeit.timeit("[ y for x in a for y in x]",setup='a=zip(range(100),range(100))',number=1000000) 
12.833590984344482

对于小列表,
列表理解
是好的,但是对于大列表,您需要使用
迭代器
一点时间提示列表理解比
itertools
版本稍微快一点(对于短列表-对于长列表则相反):

迭代方法的关键优势在于,如果您可以避免构建整个列表,即迭代
链。从iterable
的输出,而不是将其传递给
列表
构造函数

如果您对数组进行操作,性能是一个关键考虑因素,请考虑使用<代码> NUMPY < /C> >,虽然不是标准库的一部分,但速度更快(一旦您有数组):


一点时间安排表明列表理解略快于
itertools
版本(对于短列表-表明长列表则相反):

迭代方法的关键优势在于,如果您可以避免构建整个列表,即迭代
链。从iterable
的输出,而不是将其传递给
列表
构造函数

如果您对数组进行操作,性能是一个关键考虑因素,请考虑使用<代码> NUMPY < /C> >,虽然不是标准库的一部分,但速度更快(一旦您有数组):


[子列表中的项目对应于子列表中的项目]
将与任何长度的一级嵌套列表一起使用。您所说的“更好”是什么意思?@jornsharpe Faster。名单很长,而且会发生很多事情。那么你有没有尝试过或尝试过你的各种选择,看看哪一个最快?你真的需要整个列表吗,还是只是重复一下?@Joel有一个普通的列表,子列表有多长并不重要。如果你有一个固定的结构,你可以考虑使用,这取决于你到底想做什么。名单很长,而且会发生很多事情。那么你有没有尝试过或尝试过你的各种选择,看看哪一个最快?你真的需要整个列表吗,还是只是重复一下?@Joel有一个普通的列表,子列表有多长并不重要。如果你有一个固定的结构,你可以考虑使用,这可能更有效取决于你到底想做什么。你能在清单理解版上对这一点进行改进吗?你能在列表理解版上对它做些什么改进吗?我稍微修改了我的问题。所有子列表都有长度2,我不关心列表的最终顺序。拉链加上一点额外的东西似乎几乎可以把它绑在一起。有没有办法再调整一下?@Joel请提供一些上下文。如果有一种不同的方法可以完全删除这一小块代码,那么优化这一小块代码是没有意义的。同样,如果避免构建整个列表,您可以从
itertools
中获得最佳效果;你能否做到这一点取决于你想用它做什么,目前我们不知道这是什么。我的问题是,我在问题中引用的编辑中的
f2
是否可以加速到超过
f1
。这就是我问题的实质。如果您必须有更多的上下文:我们有一个图表中数千条边的列表,需要随机重新布线。要做到这一点,请将列表展平,洗牌,将相邻的对连接在一起。然后,我们再次收集数千条边重新布线。一次又一次。再说一次,然后你应该调查一下。我看不出有什么方法可以“调整”
zip
方法。我已经编写了一些
networkx
算法。如果我能找到执行此算法的“最佳”方法,它可能也会进入
networkx
。无论如何,谢谢你在这方面的帮助。我稍微修改了我的问题。所有子列表都有长度2,我不关心列表的最终顺序。拉链加上一点额外的东西似乎几乎可以把它绑在一起。有没有办法再调整一下?@Joel请提供一些上下文。如果有一种不同的方法可以完全删除这一小块代码,那么优化这一小块代码是没有意义的。同样,如果避免构建整个列表,您可以从
itertools
中获得最佳效果;你能否做到这一点取决于你想用它做什么,目前我们不知道这是什么。我的问题是,我在问题中引用的编辑中的
f2
是否可以加速到超过
f1
。这就是我问题的实质。如果