“压缩”序列中的任意序列(实际上是映射序列)

时间:2013-07-12 12:49:14

标签: python list tuples map-function

这很好用:

In [53]: map(None, a,c,d)
Out[53]: [(1, 4, 'a'), (2, 5, 'b'), (3, 6, None), (None, 7, None)]

In [60]: a
Out[60]: [1, 2, 3]

In [61]: c
Out[61]: [4, 5, 6, 7]

In [62]: d
Out[62]: ['a', 'b']

但如果我想要列表而不是元组,它就会失败:

In [54]: map(list, a,c,d)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-54-9447da50383e> in <module>()
----> 1 map(list, a,c,d)

TypeError: list() takes at most 1 argument (3 given)

我可以通过以下方式解决这个问题:

In [58]: [list(x) for x in map(None, a, c, d)]
Out[58]: [[1, 4, 'a'], [2, 5, 'b'], [3, 6, None], [None, 7, None]]

但是我可以直接在map()中使用smth吗?

似乎大多数序列都有这个问题:

In [59]: tuple(3,3,5)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-59-f396cf5fe9be> in <module>()
----> 1 tuple(3,3,5)

TypeError: tuple() takes at most 1 argument (3 given)   

我希望能够将一个特殊的序列传递给map(),并获得这些序列的列表(例如列表,集合等),并结合来自“zipped”(映射)序列的后续元素。

3 个答案:

答案 0 :(得分:1)

>>> from itertools import izip_longest
>>> [list(x) for x in itertools.izip_longest([1,2,3],[4,5,6,7],['a','b'])]
[[1, 4, 'a'], [2, 5, 'b'], [3, 6, None], [None, 7, None]]

答案 1 :(得分:0)

使用

map(list, map(None, a, c, d))  

由于map(None, ...)相当于itertools.izip_longest(...) ..
这样更好(至少2.x):

map(list, itertools.izip_longest(a, c, d))

以下是一些例子..

In [100]: zip(a,c,d)
Out[100]: [(1, 4, 'a'), (2, 5, 'b')]

In [101]: map(None, a,c,d)
Out[101]:[(1, 4, 'a'), (2, 5, 'b'), (3, 6, None), (None, 7, None)]

In [102]: map(list, map(None, a,c,d))
Out[102]:[[1, 4, 'a'], [2, 5, 'b'], [3, 6, None], [None, 7, None]]

In [103]: import itertools
In [104]: map(list, itertools.izip_longest(a,c,d))
Out[104]:[[1, 4, 'a'], [2, 5, 'b'], [3, 6, None], [None, 7, None]]

此外,您似乎并不了解如何使用tuple&amp; list
这两个类似函数的对象采用可迭代的方式并将它们转换为tuple&amp;分别为list

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> tuple(range(10))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> list(tuple(range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

答案 2 :(得分:0)

您通常使用zip() function来压缩列表;你对map()的使用是这个函数如何运作的一个很好的副作用。

zip()仍会生成元组,但您可以将 map()结合使用:

map(list, zip(a, c, d))

或者你可以使用列表理解(过滤,嵌套循环和转换数据时速度较慢但更灵活):

[list(t) for t in zip(a, c, d)]