【问题标题】:check element of tuple at certain position - shortcut?在某个位置检查元组的元素 - 快捷方式?
【发布时间】:2018-03-01 08:25:48
【问题描述】:

我正在尝试在第二个位置具有特定符号的列表中查找元组。该列表如下所示:

list = [ (0, "a", 1), (1, "b", 2), (2, "c", 3)]

我显然可以找到所有的元组,例如通过运行以下代码获得“c”:

for item in list:
    if item[1] == "c":
        return item

我只是想知道我是否可以将上面给出的代码的 line1 和 line2 结合起来做类似的事情

for (numb1, symbol=="c", numb2) in list:
    return (numb1, symbol, numb2)

有谁知道这个有快捷方式吗?

谢谢!

【问题讨论】:

  • 列表理解也不是一个选项..
  • 很好奇为什么不能选择列表理解。我认为使用 filter 与使用列表理解相比没有巨大的性能差异。
  • 你不应该使用“list”来命名你的列表,因为它是内置函数的名称
  • 另外,用“c”查找所有元组的“明显”方法不起作用。它只找到第一个带有“c”的元组。
  • @SeanBreckenridge 存在性能差异。但它有利于列表推导......而且我也很好奇为什么列表推导在这里不可能。

标签: python list indexing tuples


【解决方案1】:

您可以将 filter 与快速 lambda 一起使用。

def get_cs(ts):
    return filter(lambda t: t[1] == 'c', ts)

或者,因为您似乎只返回找到的 first 值:

def get_cs(ts):
    return next(filter(lambda t: t[1] == 'c', ts), None)

【讨论】:

  • filter中的第一个参数应该是lambda
  • @damores 哎呀,太久了!
  • 如果不想使用函数调用,可以做 list(filter(lambda t: t[1] == 'c', ts))
【解决方案2】:
l = [item for item in list if item[1]=="c"]

【讨论】:

    【解决方案3】:

    您可以使用列表推导:

    input = [(0, "a", 1), (1, "b", 2), (2, "c", 3)]
    output = [item for item in input if item[1] == "c"]
    

    我建议你不要使用 list 作为变量名,因为它会覆盖 list() 函数

    编辑:我刚刚读到列表理解不是一个选项,所以@adam-smith 回答会这样做。性能方面,列表理解被实现为映射过滤器函数。此外,它们比过滤函数更具可读性,恕我直言。

    【讨论】:

      【解决方案4】:

      试试这个:

      print [a for a in alist if a[1]=='c']
      

      输出:

      [(2, 'c', 3)]
      

      【讨论】:

      • OP 已经声明列表理解不是一个选项。
      【解决方案5】:

      由于列表推导似乎不是一种选择,而且您似乎只对 first 匹配元组感兴趣,那么生成器表达式怎么样:

      next(t for t in ts if t[1] == 'c', None)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-16
        • 2016-07-09
        • 2021-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-13
        相关资源
        最近更新 更多