map()只返回部分参数

时间:2016-09-14 13:11:18

标签: python python-3.x

我有以下代码:

a = '0'
b = '256'
mod_add = ['300', '129', '139']
list(map(lambda a, b, x: (a < x) and (x < b), a, b, mod_add))

我想检查mod_add中的每个元素,但是

list(map(lambda a, b, x: (a < x) and (x < b), a, b, mod_add))

只返回一个False。 对于某些值(a = '100', b = '200'),它会返回'False', 'False', 'False'

我做错了什么?

4 个答案:

答案 0 :(得分:2)

ab是字符串,它们将被map正确地视为 iterables ,而不是您想要的常量。您应该使用列表推导或不将ab作为参数传递给map

>>> [a < x < b for x in mod_add]
[False, True, True]

比较可以任意链接,因此(a < x) and (x < b)可以替换为a < x < b

比较整数而不是字符串(这可能是你想要的)只是另一步之遥:

>>> [int(a) < int(i) < int(b) for i in mod_add]
[False, True, True]

答案 1 :(得分:2)

如果你真的必须使用map

list(map(lambda x: (a < x) and (x < b), mod_add))

编辑:

为了回应map对列表中只有一个元素的渴望,这对我来说真的没有意义。但如果这是你想做的,你可以尝试:

list(map(lambda x: (a < x) and (x < b), [mod_add[0]]))

我希望这会有所帮助。

答案 2 :(得分:0)

这真的是你应该更喜欢列表推导的东西。

min_, max_ = '0', '256'
# do you mean for these to be compared lexicographically?!
# be aware that '0' < '1234567890' < '256' is True

mod_add = ['300', '129', '139']

result = [min_ < mod < max_ for mod in mod_add]
# [False, True, True]

map filterreduce(现在functools.reduce)是值得肯定的强大工具,但Python往往会回避它们,而不是更加冗长,更容易阅读表达。

答案 3 :(得分:0)

a = '0'
b = '256'
mod_add['300', '129', '139']
map(lambda x: int(a)<int(x)<int(b), mod_add)

输出:

[False, True, True]