使用列表输出而不是元组进行压缩

Jan*_*cak 66 python zip list

从两个列表中列出列表的最快和最优雅的方法是什么?

我有

In [1]: a=[1,2,3,4,5,6]

In [2]: b=[7,8,9,10,11,12]

In [3]: zip(a,b)
Out[3]: [(1, 7), (2, 8), (3, 9), (4, 10), (5, 11), (6, 12)]
Run Code Online (Sandbox Code Playgroud)

而且我想拥有

In [3]: some_method(a,b)
Out[3]: [[1, 7], [2, 8], [3, 9], [4, 10], [5, 11], [6, 12]]
Run Code Online (Sandbox Code Playgroud)

我在考虑使用map而不是zip,但我不知道是否有一些标准库方法作为第一个参数.

我可以为我自己的功能,并使用地图,我的问题是,如果已经实现了一些东西.不是也是答案.

D K*_*D K 71

如果你要压缩2个以上的列表(或者就此而言只有2个),可读的方法是:

[list(a) for a in zip([1,2,3], [4,5,6], [7,8,9])]
Run Code Online (Sandbox Code Playgroud)

这使用列表推导并将列表中的每个元素(元组)转换为列表.


Eld*_*mir 33

你自己几乎得到了答案.不要使用map而不是zip.使用map AND zip.

您可以使用map和zip来实现优雅,实用的方法:

list(map(list, zip(a, b)))
Run Code Online (Sandbox Code Playgroud)

zip返回元组列表.map(list, [...])调用list列表中的每个元组.list(map([...])将地图对象转换为可读列表.


ksl*_*net 15

我喜欢zip功能的优雅,但在操作员模块中使用itemgetter()函数似乎要快得多.我写了一个简单的脚本来测试这个:

import time
from operator import itemgetter

list1 = list()
list2 = list()
origlist = list()
for i in range (1,5000000):
        t = (i, 2*i)
        origlist.append(t)

print "Using zip"
starttime = time.time()
list1, list2 = map(list, zip(*origlist))
elapsed = time.time()-starttime
print elapsed

print "Using itemgetter"
starttime = time.time()
list1 = map(itemgetter(0),origlist)
list2 = map(itemgetter(1),origlist)
elapsed = time.time()-starttime
print elapsed
Run Code Online (Sandbox Code Playgroud)

我希望zip更快,但是itemgetter方法赢了很长时间:

Using zip
6.1550450325
Using itemgetter
0.768098831177
Run Code Online (Sandbox Code Playgroud)

  • 这是OP试图做的转置.你能更新你的帖子以反映这一点吗?即,OP将两个列表转换为列表或任意数量的对.您正在将任意数量的对转换为一对列表. (2认同)
  • python 2`zip`创建一个真实的列表.这减缓了事情.尝试用`itertools.izip`替换`zip`然后. (2认同)
  • @EliasStrehle:在 Python 3.5 中,`map` 是 *lazy* 的;对于情况#2,它没有做任何实际工作(只是创建了“map”对象,没有映射输入中的任何内容)。如果您确保它生成一个“列表”,例如“list(map(itemgetter(0),origlist))”,并使用适当的微基准测试方法,例如“timeit”模块/IPython的“%timeit”魔法,则时间为更加相似。在 3.10 上,`%timeit list1, list2 = map(list, zip(*origlist))` 每个循环大约 600 毫秒,`%timeit list1, list2 = list(map(itemgetter(0), origlist)), list( map(itemgetter(1), origlist))` 约为 575 毫秒。更快,但无关紧要。 (2认同)

Bro*_*eph 6

这个怎么样?

>>> def list_(*args): return list(args)

>>> map(list_, range(5), range(9,4,-1))
[[0, 9], [1, 8], [2, 7], [3, 6], [4, 5]]
Run Code Online (Sandbox Code Playgroud)

或者甚至更好:

>>> def zip_(*args): return map(list_, *args)
>>> zip_(range(5), range(9,4,-1))
[[0, 9], [1, 8], [2, 7], [3, 6], [4, 5]]
Run Code Online (Sandbox Code Playgroud)

Python 3 更新: 在 Python 3 中,map 返回迭代器而不是列表。这是我测试过的几个选项中最快的(使用timeit模块计时):

[list(t) for t in zip(*lists)]
Run Code Online (Sandbox Code Playgroud)

3.12 更新 目前为止最快的方法似乎是

[[*t] for t in zip(a, b)]
Run Code Online (Sandbox Code Playgroud)


Cea*_*sta 5

我通常不喜欢使用 lambda,但是......

>>> a = [1, 2, 3, 4, 5]
>>> b = [6, 7, 8, 9, 10]
>>> c = lambda a, b: [list(c) for c in zip(a, b)]
>>> c(a, b)
[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
Run Code Online (Sandbox Code Playgroud)

如果您需要额外的速度,地图会稍快一些:

>>> d = lambda a, b: map(list, zip(a, b))
>>> d(a, b)
[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
Run Code Online (Sandbox Code Playgroud)

然而,map 被认为是非 Python 的,只能用于性能调整。

  • “lambda”在这里添加了什么?人们可以只写表达式而不是调用函数(这实际上并不复杂),即使有人想要一个函数,也可以轻松地用两行定义它(如果你的返回键坏了或者你疯了,就用一行) 。另一方面,如果第一个参数是一个普通函数(而不是“lambda”),那么“map”就完全没问题。 (5认同)

小智 5

我想列表理解将是非常简单的解决方案。

a=[1,2,3,4,5,6]

b=[7,8,9,10,11,12]

x = [[i, j] for i, j in zip(a,b)]

print(x)

output : [[1, 7], [2, 8], [3, 9], [4, 10], [5, 11], [6, 12]]
Run Code Online (Sandbox Code Playgroud)