【问题标题】:Python for and if on one linePython for and if 在一行
【发布时间】:2015-12-11 09:08:22
【问题描述】:

我对 python 有疑问。

我列了一个简单的清单:

>>> my_list = ["one","two","three"]

我想创建一个“单行代码”来查找字符串。

例如,我有这个代码:

>>> [(i) for i in my_list if i=="two"]
['two']

但是当我看到变量是错误的(我找到了我列表的最后一个值):

>>> print i
three

为什么我的变量包含最后一个元素而不是我要查找的元素?

【问题讨论】:

  • 如果您想查找符合某些条件的项目列表,请使用[i for i in my_list if ...]。如果您想找到符合某些条件的项目,请考虑使用next;例如x = next(i for i in my_list if ...)
  • i 将不包含该值,它仍被分配了所有值。结果将只包含符合条件的值。
  • 你没有错,你的解释器也没有错,只是循环直到最后一个值,即使条件不满足,所以你得到“三”以避免你可以做什么@khelwood 说
  • 为什么不使用"two" in mylist(返回布尔值)或mylist.index("two")(返回找到的字符串的位置)?既然你已经有了你要找的字符串,再让它被搜索返回是没有意义的,不是吗?

标签: python python-2.7 for-loop if-statement list-comprehension


【解决方案1】:

当你表演时

>>> [(i) for i in my_list if i=="two"]

i 遍历列表my_list。随着列表理解完成评估,i 被分配给迭代中的最后一项,即"three"

【讨论】:

  • 嗨,我用这个代码解决了这个问题: res = [(i) for i in my_list if i=="two"] !对吗?
  • 我认为值得一提的是,i 仅分配给 Python 的旧(3.x 之前)版本中的最后一项。在 Python 3.x 中,变量范围被限制在列表推导内,所以在推导之外你会看到 i 的前一个值,或者如果它没有前一个值,它将是未定义的。
  • @Cong Ma 你拒绝了一个编辑,这实际上解决了 OP 没有将结果分配给一个值的问题。
  • 他问“为什么……”,这是一个答案。如果有的话,是否将其分配给任何东西都取决于他自己。
  • “其他”怎么样?
【解决方案2】:

您正在使用列表推导生成一个过滤列表i 仍然绑定到该列表的每个元素,并且最后一个元素仍然是 'three',即使它随后从正在生成的列表中被过滤掉。

您不应该使用列表推导来挑选一个元素。只需使用for 循环和break 来结束它:

for elem in my_list:
    if elem == 'two':
        break

如果您必须有一个单行符(这与 Python 的哲学相反,可读性很重要),请使用 next() function 和生成器表达式:

i = next((elem for elem in my_list if elem == 'two'), None)

如果没有这样的匹配元素,它将把i 设置为None

上面的过滤器不是那么有用;您实际上是在测试值 'two' 是否在列表中。您可以为此使用in

elem = 'two' if 'two' in my_list else None

【讨论】:

    【解决方案3】:

    在列表理解中,循环变量 i 变为全局变量。在 for 循环中的迭代之后,它是对列表中最后一个元素的引用。

    如果您想要所有匹配项,则将列表分配给一个变量:

    filtered =  [ i for i in my_list if i=='two']
    

    如果你只想要第一个匹配,你可以使用函数生成器

    try:
         m = next( i for i in my_list if i=='two' )
    except StopIteration:
         m = None
    

    【讨论】:

      【解决方案4】:

      找到这个:

      [x for (i,x) in enumerate(my_list) if my_list[i] == "two"]
      

      将打印:

      ["two"]
      

      【讨论】:

      • 如果没有 [ ] 我不能这样做吗?!!
      【解决方案5】:

      它打印“三”的原因是因为您没有定义数组。相当于你正在做的是:

      arr = []
      for i in array :
          if i == "two" :
              arr.push(i)
      print(i)
      

      您要求的是它查看的最后一个元素,这不是您应该做的。您需要将数组存储到变量中才能获取元素。

      你正在做的英文等价物是:

      You: "I need you to print all the elements in this array that equal two, but in an array. And each time you cycle through the list, define the current element as I."
      Computer: "Here: ["two"]"
      You: "Now tell me 'i'"
      Computer: "'i' is equal to "three"
      You: "Why?"
      

      'i' 等于“三”的原因是因为三是最后一个被定义为 I 的东西

      计算机做了:

      i = "one"
      i = "two"
      i = "three"
      
      print(["two"])
      

      因为你要求它。

      如果你想要索引,去here 如果您想要数组中的值,请定义数组,如下所示:

      MyArray = [(i) for i in my_list if i=="two"]
      

      【讨论】:

        【解决方案6】:

        在 python3 中,当您尝试打印时,变量 i 将超出范围。

        要获得您想要的值,您应该将操作结果存储在一个新变量中:

        my_list = ["one","two","three"]
        result=[(i) for i in my_list if i=="two"]
        print(result)
        

        然后你会得到以下输出

        ['two']
        

        【讨论】:

          【解决方案7】:

          简答:

          1. if 语句的一行循环
          my_list = [1, 2, 3]
          [i for i in my_list if i==2]
          
          1. if 和 else 语句的一行循环。 不幸的是,我们不能像上面那样把 if-else 语句放在最后。
          [i if i==2 else "wrong" for i in my_list]
          

          【讨论】:

            猜你喜欢
            • 2015-10-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-14
            相关资源
            最近更新 更多