2017-05-24 77 views
1

我有以下列表:冷凝if语句

languages =["java", "haskell", "Go", "Python"] 
animals = ["pigeon", "python", "shark"] 
names = ["Johan","Frank", "Sarah"] 

我想了解在所有三个以下列表中是否存在蟒蛇。下面的if语句就是我使用“in”方法和“and”运算符创建的。

if("Python" in languages and "Python" in animals and "Python" in names) 

有没有办法将这个语句压缩成更小的长度?
I.E.

if("Python" in languages and in animals and in names) 

回答

6

可避免重蹈"Python"

if all("Python" in L for L in [languages, animals, names]): 

但是,这不是短得多。

+0

有没有办法使用范围内的一个方法,一个方法是什么?即“蟒蛇”与L.lower()的比较? –

+0

是的,L''中的''Python''部分可以用L.lower()'中的'“python”或任何表达式替换,尽管它们中的一些需要包围括号或括号。 –

4

考虑:

if all("Python" in x for x in (languages, animals, names)): 
2

我不认为Python有任何语法糖特别是这样的,但是这取决于你有多少名单有,你可以不喜欢

if all("Python" in x for x in [languages, animals, names]) 

就其本身而言,它可能是一个有点比更详细你的and s,但是如果你有大量的列表,或者你已经有一个列表的列表,那么它应该节省一些空间,恕我直言,它更直接地清楚if语句的目标是什么。

5

如果这是你希望重复做一个测试,这将是更有效的预先计算的列表的交集:一个

lanimes = set(languages) & set(animals) & set(names) 

if "Python" in lanimes: 

(该in操作是O(n)列表,O(1)为一组)。

+0

对于经常重复的操作是完全有意义的。对于一次性支票,建立套餐需要花费比列表的全部扫描更长的时间来进行检查。 – 9000

+0

我把'lanimes'当作'set()'。它必须检查每个列表。 –

+1

@RahulKP:是的,这里预计会有一个空集,因为样本列表中不包含任何共同的元素。 – jasonharper

0

简短回答:不,语言语法不允许这样做。

如果你真的要削减重复'Python',你可以在你的,如果条件中使用这样的事情:

all('Python' in p for p in (languages, animal, names)) 

我也建议,也许你可以重新评估的设计,使你的代码更灵活。理解和生成器表达式是一个好的开始。