【问题标题】:Python - How to use map function and lambda function with if conditionPython - 如何在 if 条件下使用 map 函数和 lambda 函数
【发布时间】:2020-11-16 09:25:05
【问题描述】:

我想使用 map 函数和 lambda 函数来比较 wordlist 和 checklist 如果单词列表和清单中的单词。这个词将在词表中删除。 任何人都可以帮助我吗?非常感谢

wordlist = ['hello','world','Tom']
checklist = ['hello','world']

print('before')
print(wordlist)

list(map(lambda x: wordlist.remove(x) if x in checklist else None ,wordlist))
print('after')
print(wordlist)

当前结果: 前 ['你好','世界','汤姆'] 后 ['世界','汤姆']

预期结果: 前 ['你好','世界','汤姆'] 后 ['汤姆']

【问题讨论】:

  • 在迭代列表时永远不应该从列表中删除项目。
  • @bereal 是对的。最好将所有不匹配的字符串添加到新列表中:new_lsit = [x for x in wordlist if x not in checklist]

标签: python dictionary if-statement lambda


【解决方案1】:

map 总是为每个输入项生成一个输出项,它不能删除 元素。此外,map 不应该用于改变对象,这不是它的工作,因为它很懒,结果可能出乎意料。

filter 旨在创建元素少于输入的输出,但如果您已经拥有现成的谓词(过滤)功能,它最有用。

既然你不这样做,你可以并且应该使用comprehensions,它提供了一种相对简洁的方式来在单个构造中执行迭代、过滤、映射和收集:

wordlist = ['hello','world','Tom']
checklist = ['hello','world']

print('before')
print(wordlist)

wordlist = [word for word in wordlist if word not in checklist]
print('after')
print(wordlist)

ps:如果您想就地修改内容,请使用常规循环

【讨论】:

  • 那是地图功能的限制。非常感谢
  • “限制”是错误的术语,它表示不足。熊不能飞不是“限制”,它只是熊的看跌性的一部分。同样,map 有一项非常具体的工作,过滤内容不是该工作的一部分。
  • 你是对的。我只是想知道地图功能可以做什么,不能做什么。实际上,从列表中删除这个词不是我的目标。我想通过迭代对所有元素应用对象函数。我想用一行来解决
【解决方案2】:

你可以试试这个,它不使用lambda,但可以实现你的目标。如果您绝对必须使用lambda,请告诉我们。您的 lambda 表达式的问题在于您修改了要在 lambda 函数中映射的列表。

wordlist_2 [word for word in wordlist if word not in checklist and word]

最后一个and word 是不要将None 添加到您的列表中。

【讨论】:

  • 现在明白了!非常感谢我正在练习使用 map 函数和 lambda 函数。
【解决方案3】:

问题是您在对其进行迭代时从wordlist 中删除元素,这会干扰迭代。但是map 是错误的。

与您现在所做的最接近的解决方案使用filter

x = list(filter(lambda x: x not in checklist, wordlist))

这将返回一个过滤器对象,然后将其转换为列表。

最好只使用列表推导:

y = [x for x in wordlist if x not in checklist]

这些都产生相同的结果。

请注意,如果checklist 很大,那么首先创建一个集合,然后检查集合中的成员关系会更有效,例如checkset = set(checklist),然后是 x not in checkset。功能上是一样的,但如果checklist 很大,则该集合更有效。

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多