可以说,我有一个这样的名单:
list_of_lists = [['how to apply'],['a function'],['to each list?']]
我有一个功能,让我们说,我想给F
功能适用于F
功能的每个子表可以计算约两列出了一些成绩。如何申请这个F
功能list_of_lists
的每个列表,并在一个新的列表这样的回报每评分:
new_list = [score_1, score_2, score_3]
我试着用以下的map
功能:
map(F, list_of_lists).append(new_list)
您可以使用内置的qazxsw POI做到这一点。
所以,如果你想申请的功能map
,你会怎么做:
len
在>>> list_of_lists = [['how to apply'],['a function'],['to each list?']]
>>> map(len, list_of_lists)
[1, 1, 1]
,上述返回一个map迭代器,所以你需要一个明确的Python3
电话:
list
如果您正在寻找为此编写一些代码,必须是在这两个Python2和Python3兼容,列表内涵是要走的路。就像是:
>>> map(len, list_of_lists)
<map object at 0x7f1faf5da208>
>>> list(map(len, list_of_lists))
[1, 1, 1]
将同时在Python 2和3工作,没有任何变化。
但是,如果你输入list_of_lists是巨大的,在Python3使用[apply_function(item) for item in list_of_lists]
会更有意义,因为迭代器会快很多。
怎么样
map
这将遍历list_of_lists,调用F与每个子列表作为参数,然后生成结果列表。
如果您想使用的子表,因为所有的参数[ F(x) for x in list_of_lists ]
你可以做到这一点略有不同的
F
您可以使用列表理解,这样的
[ F(*x) for x in list_of_lists ]
例如,
[function_to_be_done(item) for item in list_of_lists]
注意:虽然列表内涵看起来像一个方式的功能适用于所有的元素,它的主要目的是建立一个新的列表。所以,如果你不希望建立一个新的列表,然后只需用>>> list_of_lists = [['how to apply'],['a function'],['to each list?']]
>>> [len(item) for item in list_of_lists]
[1, 1, 1]
循环迭代,并调用该函数。
除此之外,您可以使用for
功能在Python 2.7,到功能应用到所有元素,并构建一个列表。例如,
map
但是,>>> list_of_lists = [['how to apply'],['a function'],['to each list?']]
>>> map(len, list_of_lists)
[1, 1, 1]
返回在Python 3.x中的地图迭代器对象所以,你需要明确地将其转换成一个列表,像这样
map
你可能想读些什么,圭多想着在这个>>> list_of_lists = [['how to apply'],['a function'],['to each list?']]
>>> map(len, list_of_lists)
<map object at 0x7f94026afd30>
>>> list(map(len, list_of_lists))
[1, 1, 1]
map
。
基本上,post将更经常要求你创建一个新的功能(主要是人创造map
功能)。但是,在很多情况下,列表理解避免了。
一些作品上任意嵌套列表,例如[[1,2],[[5]],[7,[8,[9,11]]]]:
lambda
这里是运行这个示例:
def apply_f(a,f):
if isinstance(a,list):
return map(lambda t:apply_f(t,f), a)
else:
return f(a)
这里是如何做同样仅在选定的水平:
>>> ll=[[1,2],[[5]],[7,[8,[9,11]]]]
>>> apply_f(ll,lambda t:t**2)
[[1, 4], [[25]], [49, [64, [81, 121]]]]
例如获得
def apply_f(a,f,depth,levels):
if isinstance(a,list):
return map(lambda t:apply_f(t,f,depth+1,levels), a)
else:
if depth in levels:
return f(a)
else:
return a
也有一些优化技术在这里做,避免传递>>> apply_f(ll,lambda t:t**2, 0, [2,4])
[[1, 4], [[5]], [49, [8, [81, 121]]]]
和f
各地(使递归函数的内部功能的包装,所以它可以使用levels
和f
从外范围内),但这是次要的。 (注意,这是Python 2中,为Python 3,你需要用别的东西来代替levels
)。
对于一个更通用的输入,下面会做的伎俩:
map
所以现在还有以下种类的作品:
def apply_f(a,f):
try:
return(f(a))
except:
return map(lambda t:apply_f(t,f), a)
(事情会略微改写,因为>> apply_f([(1,2),[[5]],[7,(8,[9,11])]],lambda t:t**2)
[[1, 4], [[25]], [49, [64, [81, 121]]]]
总是产生列表...)
地图是你的朋友! map()
取一个函数和一个可迭代(列表,例如)和列表中的每个元件上适用的功能。
map
产量
map(len, [['how to apply'],['a function'],['to each list?']])
如果你想要做的子表的元素更精细的计算,你可以窝在地图:
[1, 1, 1]
产量
map(lambda x: map(lambda y: y + 1, x), [[1], [1, 2], [1, 2, 3]])
另一种可能的方法(也来自函数式编程)的列表内涵。列表理解是Python从迭代构建一个列表的方式。语法是[[2], [2, 3], [2, 3, 4]]
。任何计算可以在元件上完成,所以
[element for element in iterable]
意味着所得到的列表将是元素,其中每个元素是函数f的结果的列表。像图,列表解析可以进一步嵌套的,从而产生一个嵌套元件的功能应用。
[f(element) for element in iterable]
产量
[element + 1 for element in el] for el in [[1], [1, 2], [1, 2, 3]]]