使用Python中的map()有条件地迭代不等的列表

时间:2017-11-23 12:24:46

标签: python

我想这样做:

a = ['xxx', 'yyy']
b = 'yyy'

for each_item in a:
    if each_item == b:
        print(['zzz'])
>>>['zzz']

我可以用列表理解来做到这一点:

print(['zzz' for each_item in a if each_item in b])
>>>['zzz']

Q1。请告诉我如何使用map()函数编写这个?这些列表长度不等,第一个列表可能很大

Q2。在函数式编程中写这个有什么其他选择吗?

3 个答案:

答案 0 :(得分:3)

您可能正在寻找filter

a = ['xxx', 'yyy']
b = 'yyy'

interesting = list(filter(lambda x: x == b, a))
print(interesting)

或者使用生成器理解来获取更大的列表:

a = ['xxx', 'yyy']
list_ = (item 
    for item in a 
    if item == b)

答案 1 :(得分:2)

它相当于filter而不是map,所以当你想要避免列表推导时,你应该这样做:

filter(lambda x: x==b, a)

使用map,您可以写:

map(lambda x: print(x) if x==b else None, a)

...但在我的意见中,它是一种糟糕的风格和纯粹功能构造(map)与副作用动作(print)的混合

注意filtermap都返回Python 3中的可迭代对象,但不返回列表。如果您想要访问filtermap中的所有结果,请将其投放到列表中,即list(filter(...))list(map(...))

答案 2 :(得分:0)

你需要使用filter()而不是map()来过滤掉你的case列表中的iterable值,就像这样

=IIf(IsDate(Parameters!frompay.Value), FormatDateTime(
CDate(iif(isdate(Parameters!frompay.Value),Parameters!frompay.Value,"01/01/1900")),
DateFormat.ShortDate),
"Empty")

you can find more about filter here