【问题标题】:Multiple If/else in list comprehension in PythonPython中列表理解中的多个If/else
【发布时间】:2017-11-14 18:10:39
【问题描述】:

我有这个

s = ['son','abc','pro','bro']
b = ['son','bro']
c = ['pro','quo']

预期的输出是这样的。输出中的项目是 index(item_in_s),如果它存在于列表 b 中。或者 index(item_in_s)+10 如果项目在 c 中。

[0,12,3]

我试过这个:

index_list = [s.index(item) if item in b else s.index(item)+10 if item in c for item in s]
print(index)

但显然这是一个语法错误。所以我尝试了这个:

index_list = [s.index(item) if item in b else s.index(item)+10 for item in s if item in c]
    print(index)

输出:

[12]

这只是改变了整个逻辑。虽然我可以这样做

fin = [s.index(item) if item in b else s.index(item)+10 if item in c  else '' for item in s]
fin = [item for item in fin if item!='']
print(fin)

获得的期望输出:

[0, 12, 3]

但是我如何在列表推导本身中获得我想要的东西,或者在列表推导中是否有 else continue 之类的东西?

【问题讨论】:

  • 我不太明白你想在这里做什么。
  • 只需输入类似[x if x in list1 else x+10 if x in list2 for x in my_list] 的内容,它会给出语法错误。
  • 我想要[x if x in list1 else x+10 if x in list2 else pass for x in my_list] 之类的东西,但我知道 pass 也会出现语法错误。有其他选择吗?
  • 把你的代码分成几行。我不明白你对输入的输出是什么
  • 只是。写。答:对于。环形。并使用enumerate 而不是.index,这会使您的算法效率低下。

标签: python python-2.7 list python-3.x list-comprehension


【解决方案1】:
index_list = [s.index(item) if item in b else s.index(item) + 10 for item in s if item in b or item in c]

我们确保它在 b 或 c 中,然后索引将是其中一种情况。

【讨论】:

    【解决方案2】:

    已经给出了很好的答案,这里还没有提到:

    fin = [item for item in ([s.index(item) if item in b else s.index(item)+10 if item in c  else '' for item in s]) if item!='']
    print(fin)
    

    基本上它是原始2行代码的组合:

    fin = [s.index(item) if item in b else s.index(item)+10 if item in c  else '' for item in s]
    fin = [item for item in fin if item!='']
    

    不一定是“更快或更好”,只是以前没有给出的组合。 在进行列表推导时,您总是面临迭代次数超出实际需要的风险。

    更好的解决方案是for 循环,在另一个答案中给出。

    【讨论】:

    • 如果你能解释你的解决方案是如何工作的,以及它如何比其他答案更好,那将会更有用。纯代码答案并不是很有帮助。
    【解决方案3】:

    您的解决方案故障可以通过避免列表 b&c 中不存在的元素来解决。

    您可以通过创建新列表并应用简单的集合操作来做到这一点

    检查您的解决方案中的这个小改动。

    fin = [s.index(item) if item in b else s.index(item)+10 if item in c  else '' for item in list(set(b+c)&set(s))]
    

    通过这样做,您的条件语句 else 将永远不会执行您正在迭代的原因列表仅具有 bclist 元素/strong> 仅限。

    【讨论】:

      【解决方案4】:

      从根本上说,列表理解会迫使您非常低效:

      >>> [i if item in b else i + 10 if item in c else None for i, item in enumerate(s) if item in b or item in c]
      [0, 12, 3]
      

      这必须检查bc 中的成员item 在最坏的情况下每个 如果你想要那个输出。相反,只需使用 for 循环

      >>> index_list = []
      >>> for i, item in enumerate(s):
      ...     if item in b:
      ...         index_list.append(i)
      ...     elif item in c:
      ...         index_list.append(i + 10)
      ...
      >>> index_list
      [0, 12, 3]
      >>>
      

      简单、易读、直接且 Pythonic。

      【讨论】:

      • 条件item in b可以被移除,只在Python 3.8到来时检查一次,我们可以使用(item_in_b := item in b),稍后再做if item_in_b
      猜你喜欢
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2017-03-20
      • 2017-04-26
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多