Python “中的任意序列”;拉链式;序列(实际映射的序列)
这很有效:Python “中的任意序列”;拉链式;序列(实际映射的序列),python,list,tuples,map-function,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 [54]: map(list, a,c,d) --------------------------------------------------------------------------- TypeError
In [53]: map(None, a,c,d)
Out[53]: [(1, 4, 'a'), (2, 5, 'b'), (3, 6, None), (None, 7, None)]
(
)
但如果我想要列表而不是元组,它会失败:
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)
但是有没有smth可以直接在map()中使用
似乎大多数序列都有这个问题:
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)
[59]中的:元组(3,3,5)
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1元组(3,3,5)
TypeError:tuple()最多接受1个参数(给定3个)
我希望能够将一个特殊的序列传递给map(),并获得这样的序列列表(如列表、集合等),这些序列组合了“压缩”(映射)序列中的后续元素。使用
map(list, map(None, a, c, d))
因为map(None,…)
相当于itertools.izip\u longest(…)
。这更好(至少在2.x中): 这里有一些例子
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]]
此外,您似乎不知道如何使用元组&列表:
这两个类似函数的对象获取一个iterable,并将它们分别转换为元组
&列表
>>> 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]
您通常使用压缩列表;您使用map()
是该函数工作方式的一个令人愉快的副作用
zip()
仍然会生成元组,但您可以将其与map()
结合使用:
或者您可以使用列表理解(在筛选、嵌套循环和转换数据时,速度较慢但更灵活):
我没有明确地写我需要从最长的序列中生成所有值,并用smth-else(像None一样)替换较短序列中缺少的值,因此是zip()没有用,因为它会将结果序列截断为最短序列的长度。我也喜欢这个解决方案,因为izip_longest有一个fillvalue=kw参数
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]]
>>> 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]
map(list, zip(a, c, d))
[list(t) for t in zip(a, c, d)]
>>> 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]]