【问题标题】:How to return a list of the following position if Boolean is True while using lambda, map, and list?如果在使用 lambda、map 和 list 时 Boolean 为 True,如何返回以下位置的列表?
【发布时间】:2019-06-11 16:53:22
【问题描述】:

我有一个名字列表,每个名字后面都有一个数字。像这样

l = ["Bob", 4, "Rob", 5, "Sam", 6, "Bob", 5]

我想返回一个与给定名称对应的数字列表,仅使用 lambda、map、list 或 filter。

例如,如果我将名字 Bob 与 list = ["Bob",4,"Rob",5,"Sam",6,"Bob",5] 一起使用,我的输出将是

[4,5]

我想我了解 lambda 的大部分内容,但我无法让它返回我想要的东西。

mx = list(map(lambda x: l[x+1] if x == name, l))

我收到此错误。 Syntax Error: invalid syntax: <string>, line 14, pos 29

【问题讨论】:

  • l[x+1] if x == name 不是语法上有效的表达式。 lambda 函数只接受表达式。无论如何,map 在这里似乎并不合适,至少不在该列表中,因为您提供的任何功能 map 都将应用于每个元素。您可能希望首先将列表的元素成对分组,然后映射一个适用于这些对的函数...
  • 另外,想想如果这确实有效会发生什么:l[x+1] if x == name 所以如果x == 'Bob',那么你将使用l["Bob" + 1] 索引到l,这不会感觉。
  • 您最初从哪里获得该列表?如果每个名称都与下面的数字相关联,那么像[("Bob", 4), ("Rob", 5), ...] 这样更明确的东西会更自然。 (也很容易获得:zip(l[0::2], l[1::2])。)

标签: python python-3.x lambda


【解决方案1】:

您可以遍历偶数索引处的值,并在匹配名称时输出下一个索引处的值:

result = [l[i+1] for i in range(0,len(l),2) if l[i] == "Bob"]

如果你被允许使用枚举,这可以更简洁一些(假设奇数索引都不包含匹配字符串):

result = [l[i+1] for i,n in enumerate(l) if n == 'Bob' ]

或使用 zip()

result = [v for n,v in zip(l,l[1:]) if n == 'Bob']

【讨论】:

    【解决方案2】:

    将列表重构为元组列表;那么列表理解是微不足道的:

    items = [number for (name, number) in zip(l[0::2], l[1::2]) if name == "Bob"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2023-03-18
      • 2016-08-16
      • 2011-11-24
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多