在python中使用map读取整数序列

时间:2012-02-09 09:04:47

标签: python map lambda

有人可以解释下面的python代码是如何工作的吗?此代码正在读取一系列整数,这些整数排列为3元组。

inverted_list = map(lambda i: (int(numbers[2 + 3*i]),
                           float(numbers[3 + 3*i]),
                           float(numbers[4 + 3*i]))
                    ,range(0, (len(numbers) - 2)/3))

map和lambda究竟是如何工作的?这里真的需要lambda吗?

感谢。

4 个答案:

答案 0 :(得分:1)

这大致相当于这个列表理解。使用带有lambda的map会比列表理解慢一点

inverted_list = [((int(numbers[2 + 3*i]), float(numbers[3 + 3*i]), 
                float(numbers[4 + 3*i])) for i in range(0, (len(numbers) - 2)/3)]

打败我,为什么你会把i乘以3到处,

inverted_list = [((int(numbers[i]), float(numbers[1+i]), 
                float(numbers[2+i])) for i in range(2, len(numbers), 3)]

答案 1 :(得分:1)

不,这里不需要lambda,这也可以写成:

inverted_list = [(int(numbers[2 + 3*i]),
                  float(numbers[3 + 3*i]),
                  float(numbers[4 + 3*i])) for i in range(0, (len(numbers) - 2)/3]

我不会进入索引器的数学位,因为我今天只在我的第一杯咖啡上,但map所做的是将一个函数应用于一个序列,生成一个新的序列以及每个元素的函数结果。 lambda是函数,在这种情况下,从您的数字创建一个元组。序列是range表达式,它为您提供了可在索引表达式中使用的i值列表(例如3 + 3*i)。

您的代码片段@gnibbler的版本和我向您展示的是现代 python。这不是在python 1.5中 - 所以我们使用mapreducezip和其他“功能”高阶操作。我个人非常喜欢他们,但我想大多数任务都注定要被替换 - 列表理解在这样的情况下更具表现力!

答案 2 :(得分:1)

它会创建一个列表

(numbers[2],numbers[3], numbers[4], numbers[2 + 3],numbers[3 + 3], numbers[4 + 3], ...., numbers[2 + 3*((len(numbers) -2)/3)],numbers[3 +  3*((len(numbers) -2)/3)], numbers[4 + 3*((len(numbers) -2)/3)]

映射范围:

range(0, (len(numbers) - 2)/3)

与lambda的元组。

一种方法是使用列表推导和迭代范围从2开始,大小为3步:

[(int(numbers[i]), float(numbers[i + 1]), float(numbers[i + 2])) for i in range(2,len(numbers), 3)]

答案 3 :(得分:1)

你已经有了解释更好或更现代的方法来表达这一点,但我想准确地说明lambda和map在更多基本功能方面的作用。首先,这是你的例子:

inverted_list = map(lambda i: (int(numbers[2 + 3*i]),
                               float(numbers[3 + 3*i]),
                               float(numbers[4 + 3*i]))
                    ,range(0, (len(numbers) - 2)/3))

为了让事情更清楚一点,我将把论点分开。这相当于;我所做的就是在一个单独的语句中计算要映射的每个参数:

func = lambda i:(int(numbers[2 + 3*i]),
                 float(numbers[3 + 3*i]),
                 float(numbers[4 + 3*i]))
sequence = range(0, (len(numbers) - 2)/3)
inverted_list = map(func, sequence)

lambda只是一种在表达式中表达简单函数的方法。我们可以用常规函数替换它而不改变效果:

def func(i):
    return (int(numbers[2 + 3*i]),
            float(numbers[3 + 3*i]),
            float(numbers[4 + 3*i]))
sequence = range(0, (len(numbers) - 2)/3)
inverted_list = map(func, sequence)

map是所谓的“高阶函数”,一个将另一个函数作为参数的函数。 map将遍历sequence中的每个项目,使用该项目作为参数调用func,获取函数返回的任何内容并将其附加到新列表。*

如果你想在没有高阶函数或生成器表达式的情况下做同样的事情,你可以写出来:

def func(i):
    return (int(numbers[2 + 3*i]),
            float(numbers[3 + 3*i]),
            float(numbers[4 + 3*i]))
sequence = range(0, (len(numbers) - 2)/3)
inverted_list = []
for item in sequence:
    inverted_list.append(func(item))

lambda的好处是你可以在一个表达式中表达一些需要引入临时变量的东西,并且可能在你想要使用它之前以某种方式声明函数。 map的好处类似于你可以在一个表达式中写入一些本来需要临时变量和循环的东西。

(*)从Python 3开始,map实际上返回一个迭代器,而不是一个列表。