列表解析python中的多个If / else

时间:2017-06-13 06:05:02

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

我有这个

(?<!,),(?!,)

预期的输出就是这个。输出中的项目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] 的东西?任何解释都将非常感激。

4 个答案:

答案 0 :(得分: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]

如果您想要输出,则必须在最差情况下检查itemb 中的成员资格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]
>>>

简单,可读,直接和Pythonic。

答案 1 :(得分:1)

您的解决方案故障可以通过避免列表b&amp; 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))]
  

通过这样做你的条件语句其他永远不会执行你正在迭代的原因列表只有在 b c <列表的元素/ strong> only。

答案 2 :(得分:0)

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中,然后索引将是其中一个案例

答案 3 :(得分:0)

已经给出了很好的答案,这里有一个尚未提及的答案:

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循环,在另一个答案中给出。