python map vs list comprehsnion

时间:2017-03-30 15:18:06

标签: python python-3.x

我试图返回一串数字的最小值和最大值,即。 (“1 2 3 4 5 6”)

我想出的代码如下

def high_and_low(numbers):
    numbers = numbers.split(' ')
    map(int, numbers)
    return str(max(numbers)) + ' ' + str(min(numbers))

此代码不适用于以下示例:

print(high_and_low("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6"))
6 -214

然而,类似的功能精心设计为:

def min_and_max(numbers):
    nn = [int(s) for s in numbers.split(' ')]
    return "%i %i" % (max(nn),min(nn))

返回正确答案

print(min_and_max("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6"))
542 -214

不应该

map(int, numbers)

相同
[int(number) for number in numbers]

为什么这两个函数不返回相同的值?

3 个答案:

答案 0 :(得分:4)

不,不应该因为你没有将map的结果分配到任何地方,minmax使用来自numbers的{​​{1}}。也就是说,你正在使用字符串比较。

列表理解保存到numbers.split(' '),这是nnmin中使用的名称。

尽管如此,即使你 还是max的结果:

map

你仍然会收到错误,因为numbers = map(int, numbers) 将首先使用迭代(直到它耗尽),然后max会抱怨,因为它会收到一个空的可迭代。

您可能需要使用min之类的内容,同时为itertools.tee提供minmax,或者使用已完成的列表理解。

答案 1 :(得分:4)

high_and_low方法中,map(int, numbers)未分配给某个值。

def high_and_low(numbers):
    numbers = numbers.split(' ')
    numbers = map(int, numbers)
    return str(max(numbers)) + ' ' + str(min(numbers))

此外,map在Python 3.x中返回iterator。您的min(numbers)会出现错误,因为max会耗尽iterator,并因空序列而抛出ValueError。因此,您需要将其转换为list

def high_and_low(numbers):
    numbers = numbers.split(' ')
    numbers = list(map(int, numbers))
    return str(max(numbers)) + ' ' + str(min(numbers))

答案 2 :(得分:1)

  

为什么这两个函数不返回相同的值?

因为您在地图中涉及的功能无法正常使用。

当你写

def high_and_low(numbers):
    numbers = numbers.split(' ')
    map(int, numbers)    ## DOES NOT WORK IN PLACE
    ## So ADD THE LINE BELOW
    numbers = map(int, numbers)    
    return str(max(numbers)) + ' ' + str(min(numbers))

你必须在某处重新分配numbers,如此

numbers = map(int, numbers)