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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用列表输出而不是元组进行压缩相关的知识,希望对你有一定的参考价值。

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

我有

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

而且我想拥有

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

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

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

答案

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

[list(a) for a in zip([1,2,3], [4,5,6], [7,8,9])]

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

另一答案

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

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

list(map(list, zip(a, b)))

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

另一答案

我喜欢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

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

Using zip
6.1550450325
Using itemgetter
0.768098831177
另一答案

我一般不喜欢使用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]]

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

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

但是,map被认为是unpythonic,应该只用于性能调整。

另一答案

这个怎么样?

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

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

甚至更好:

>>> def zip_(*args): return map(list_, *args)
>>> zip_(range(5), range(9,4,-1))
[[0, 9], [1, 8], [2, 7], [3, 6], [4, 5]]
另一答案

Using numpy

优雅的定义可能非常值得怀疑但是如果你正在使用numpy,那么数组的创建及其转换为列表(如果需要的话......)可能非常实用,即使使用map函数或列表理解相比也不是那么有效。

import numpy as np 
a = b = range(10)
zipped = zip(a,b)
result = np.array(zipped).tolist()
Out: [[0, 0],
 [1, 1],
 [2, 2],
 [3, 3],
 [4, 4],
 [5, 5],
 [6, 6],
 [7, 7],
 [8, 8],
 [9, 9]]

否则跳过zip函数你可以直接使用np.dstack

np.dstack((a,b))[0].tolist()
另一答案

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

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

以上是关于使用列表输出而不是元组进行压缩的主要内容,如果未能解决你的问题,请参考以下文章

为啥解包在 Python 中给出一个列表而不是一个元组?

使用导航架构组件添加(而不是替换)片段

如何使用 OCaml 将两个列表中的每个单独元素压缩到一个列表中

Django 错误遵循教程 b/c 使用 3.1 而不是 1.9 TypeError:在 include() 的情况下,视图必须是可调用的或列表/元组 [重复]

根据字符串名称而不是列表视图项位置替换片段并启动活动

itertools.product - 返回列表而不是元组