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

voi*_*oid 4 python list-comprehension list python-2.7 python-3.x

我有这个

s = ['son','abc','pro','bro']
b = ['son','bro']
c = ['pro','quo']
Run Code Online (Sandbox Code Playgroud)

预期的输出是这样的。index(item_in_s)如果它出现在 list 中,则输出中的项目所在的位置b。或者index(item_in_s)+10如果一个项目在c.

[0,12,3]
Run Code Online (Sandbox Code Playgroud)

我试过这个:

index_list = [s.index(item) if item in b else s.index(item)+10 if item in c for item in s]
print(index)
Run Code Online (Sandbox Code Playgroud)

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

index_list = [s.index(item) if item in b else s.index(item)+10 for item in s if item in c]
    print(index)
Run Code Online (Sandbox Code Playgroud)

输出:

[12]
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

获得的期望输出:

[0, 12, 3]
Run Code Online (Sandbox Code Playgroud)

但是我如何在列表理解本身中获得我想要的东西,或者在列表理解中是否有类似的东西else continue

jua*_*aga 8

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

>>> [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]
Run Code Online (Sandbox Code Playgroud)

这必须检查成员itembc 各两次,如果你想要的产量在最坏的情况。相反,只需使用 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]
>>>
Run Code Online (Sandbox Code Playgroud)

简单、可读、直接和 Pythonic。


Cod*_*ing 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]
Run Code Online (Sandbox Code Playgroud)

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