【问题标题】:Python - Filtering a list of tuples with lambdaPython - 使用 lambda 过滤元组列表
【发布时间】:2021-03-21 04:42:39
【问题描述】:

我尝试使用另一个元组更新元组值。

grade = (('a', 10), ('b', 20), ('c', 30), ('d', 40))

factors = (('a', 1), ('b', 2))

预期结果:

result  = (('a', 11), ('b', 22), ('c', 30), ('d', 40))

这样做的正确方法是什么? ,我尝试了以下代码,但没有成功。我很乐意提供帮助

print(list(filter(lambda list_a: list(map(lambda x, y: x+ y, list_a[0], grade[1])) not in list(map(lambda x: x[0], factors)), grade)))

【问题讨论】:

  • 为什么 b 是 12 而不是 22
  • 是时候学习列表理解了。
  • 还有字典。
  • @toRex 你是对的我的错误,我更新了它
  • 为了改善您的问题,请简要说明更新的预期功能。我们可能会通过结果来猜测它,但有一个明确的规范会有所帮助。

标签: python list lambda filter tuples


【解决方案1】:

我会使用字典,似乎更适合您的任务:

factors = dict(factors)
grade = dict(grade)
{k: grade[k] + factors[k] if k in factors.keys() else grade[k] for k  in grade.keys()}

输出:

{'a': 11, 'b': 22, 'c': 30, 'd': 40}

【讨论】:

  • 有没有不使用dict的解决方案?
【解决方案2】:

你应该使用一个字典,你可以利用它的get方法为不存在的键获取0:

grade = (('a', 10), ('b', 20), ('c', 30), ('d', 40))

factors = (('a', 1), ('b', 2))
factors = dict(factors)

new_grades = [(g[0], g[1] + factors.get(g[0], 0)) for g in grade]
print(new_grades)
# [('a', 11), ('b', 22), ('c', 30), ('d', 40)]

【讨论】:

  • 有没有不使用dict的解决方案?
  • 这可能是可能的,但您必须获取与因子中的字母相对应的值。如果您不构建字典,您将需要一个每次迭代元组的函数,直到找到包含正确字母的函数。这是非常低效的。另一方面,一旦您构建了一次字典,就可以直接访问与字母关联的值,而无需任何迭代。这样效率更高,并且不需要您编写一个不会那么好的函数。所以,做正确的事并享受吧!
  • 另外,当您只想构建列表时,列表推导通常比使用 map 更快。
【解决方案3】:
fact = dict(factors)
result = list(
    map(
        lambda x: (x[0], x[1] + fact.get(x[0], 0)), grade
    )
)

【讨论】:

  • 有没有不使用dict的解决方案?
【解决方案4】:

factors 设为字典:

factors = dict(factors)

然后使用字典推导式使用现有的关联列表grades 构建一个新的dict

result = {g: score + factors.get(g, 0) for g, score in grade}

如果你真的需要一个元组的元组,使用

result = tuple((g, score + factors.get(g,0)) for g, score in grade)

【讨论】:

  • 试过你的代码,但它带来了:{'a': 1, 'b': 2, 'c': 0, 'd': 0}
【解决方案5】:

改用计数器怎么样?

from collections import Counter

grade = Counter(dict(grade))
factors = Counter(dict(factors))

更新很简单

grade += factors

grade.update(factors)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    相关资源
    最近更新 更多