Python 列表理解中的多个 If/else

新手上路,请多包涵

我有这个

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 的东西?

原文由 void 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 531
1 个回答

从根本上说,列表理解迫使你变得非常低效:

 >>> [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]

这必须检查成员资格 itembc 如果你想要那个输出,在最坏的情况下 _每两次_。相反, 只需使用 for-loop

 >>> 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)
...     else item in c:
...         index_list.append(None)
...
>>> index_list
[0, 12, 3]
>>>

简单、可读、直接和 Pythonic。

编辑

你可以用 赋值表达式 做一些接近于此的事情:

 [
    i if item_in_b else i + 10 if item_in_c else None
    for i, item in enumerate(s)
    if (item_in_b:=item in b) or (item_in_c:=item in c)
]

但我还是更喜欢循环。

原文由 juanpa.arrivillaga 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题