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

Python中列表理解中的多个If/else,python,python-2.7,list,python-3.x,list-comprehension,Python,Python 2.7,List,Python 3.x,List Comprehension,我有这个 s = ['son','abc','pro','bro'] b = ['son','bro'] c = ['pro','quo'] 预期输出如下所示。其中,如果列表b中有项目,则输出中的项目为索引(项目中的项目)。或者索引(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] pr

我有这个

s = ['son','abc','pro','bro']
b = ['son','bro']
c = ['pro','quo']
预期输出如下所示。其中,如果列表
b
中有项目,则输出中的项目为
索引(项目中的项目)
。或者
索引(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)
但显然这是一个语法错误。所以我试了一下:

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]
但是,我如何在列表理解本身中获得我想要的,或者列表理解中是否有类似于
的内容

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中,然后索引将是这两种情况中的任何一种。

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

>>> [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]
如果需要输出,则必须在最坏的情况下分别检查
b
c
中的成员资格
。相反,只需使用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]
>>>

简单、易读、直截了当、通俗易懂。

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

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

检查解决方案中的这一小变化。 通过这样做,您的conditinal语句else将永远不会执行您正在迭代的原因列表,原因列表中只有bc中的list元素


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

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!='']
不一定是“更快或更好”,只是一个以前没有给出的组合。 在进行列表理解时,您总是有重复次数超过实际需要次数的风险


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

我真的不明白您在这里想做什么。只需将类似于
[x if x in list1 else x+10 if x in list2 for x in my_list]的内容放入
,这会给出语法错误。我想要
[x如果列表1中的x为其他x+10如果列表2中的x为我的_列表中的x为其他传递]
但我知道pass也会产生语法错误。有其他方法吗?将代码分成几行。我不知道您要的是哪种输出与inputJust.Write.A.For.Loop.有关,并使用
枚举
而不是
.index
,这会使您的算法效率低下。如果您能够解释n您的解决方案是如何工作的,以及它是如何优于其他答案的。仅使用代码的答案没有太大帮助。当Python 3.8出现时,b中的条件项只能被删除并检查一次,我们可以使用(b中的项:=b中的项),如果b中的项,以后再使用