简体   繁体   English

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

[英]Zip with list output instead of tuple

What is the fastest and most elegant way of doing list of lists from two lists? 从两个列表中列出列表的最快和最优雅的方法是什么?

I have 我有

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

And I'd like to have 而且我想拥有

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

I was thinking about using map instead of zip, but I don't know if there is some standard library method to put as a first argument. 我在考虑使用map而不是zip,但我不知道是否有一些标准库方法作为第一个参数。

I can def my own function for this, and use map, my question is if there is already implemented something. 我可以为我自己的功能,并使用地图,我的问题是,如果已经实现了一些东西。 No is also an answer. 不是也是答案。

If you are zipping more than 2 lists (or even only 2, for that matter), a readable way would be: 如果你要压缩2个以上的列表(或者就此而言只有2个),可读的方法是:

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

This uses list comprehensions and converts each element in the list (tuples) into lists. 这使用列表推导并将列表中的每个元素(元组)转换为列表。

You almost had the answer yourself. 你自己几乎得到了答案。 Don't use map instead of zip . 不要使用map而不是zip Use map AND zip . 使用map zip

You can use map along with zip for an elegant, functional approach: 您可以使用map和zip来实现优雅,实用的方法:

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

zip returns a list of tuples. zip返回元组列表。 map(list, [...]) calls list on each tuple in the list. map(list, [...])调用list中每个元组的列表。 list(map([...]) turns the map object into a readable list. list(map([...])将地图对象转换为可读列表。

I love the elegance of the zip function, but using the itemgetter() function in the operator module appears to be much faster. 我喜欢zip功能的优雅,但在操作员模块中使用itemgetter()函数似乎要快得多。 I wrote a simple script to test this: 我写了一个简单的脚本来测试这个:

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

I expected zip to be faster, but the itemgetter method wins by a long shot: 我希望zip更快,但是itemgetter方法赢了很长时间:

Using zip
6.1550450325
Using itemgetter
0.768098831177

How about this? 这个怎么样?

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

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

Or even better: 甚至更好:

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

I generally don't like using lambda, but... 我一般不喜欢使用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]]

If you need the extra speed, map is slightly faster: 如果您需要额外的速度,地图会稍快一些:

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

However, map is considered unpythonic and should only be used for performance tuning. 但是,map被认为是unpythonic,应该只用于性能调整。

Using numpy 使用numpy

The definition of elegance can be quite questionable but if you are working with numpy the creation of an array and its conversion to list (if needed...) could be very practical even though not so efficient compared using the map function or the list comprehension. 优雅的定义可能是非常值得怀疑的,但是如果你正在使用numpy ,那么数组的创建及其转换为list(如果需要的话)可能非常实用,即使使用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]]

Otherwise skipping the zip function you can use directly np.dstack : 否则跳过zip函数你可以直接使用np.dstack

np.dstack((a,b))[0].tolist()

List comprehension would be very simple solution I guess. 我猜,列表理解将是非常简单的解决方案。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM