我有以下代码:
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'
。
我做错了什么?
答案 0 :(得分:2)
a
和b
是字符串,它们将被map
正确地视为 iterables ,而不是您想要的常量。您应该使用列表推导或不将a
和b
作为参数传递给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
filter
和reduce
(现在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]