如何将功能应用到Python中的列表中的每个子表?

问题描述 投票:4回答:5

可以说,我有一个这样的名单:

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)
python list function python-2.7 python-3.x
5个回答
5
投票

您可以使用内置的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] 会更有意义,因为迭代器会快很多。


3
投票

怎么样

map

这将遍历list_of_lists,调用F与每个子列表作为参数,然后生成结果列表。

如果您想使用的子表,因为所有的参数[ F(x) for x in list_of_lists ] 你可以做到这一点略有不同的

F

3
投票

您可以使用列表理解,这样的

[ 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功能)。但是,在很多情况下,列表理解避免了。


2
投票

一些作品上任意嵌套列表,例如[[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各地(使递归函数的内部功能的包装,所以它可以使用levelsf从外范围内),但这是次要的。 (注意,这是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]]]] 总是产生列表...)


1
投票

地图是你的朋友! 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]]]
© www.soinside.com 2019 - 2024. All rights reserved.