if-statement with list comprehension

时间:2014-10-15 11:02:47

标签: python

我想在下面的陈述中写一点更紧凑:

if day == "monday" and element[0] == 1:
    # code A
elif day == "tuesday" and element[0] == 2:
    # code A (the same)
#and so on...

我想到了列表推导,其中第一个列表包含所有工作日:["星期一","星期二"]#等等 和第二个列表整数:[1,2]#等等

这可能会使if语句写得有点紧凑吗? 非常感谢!

4 个答案:

答案 0 :(得分:2)

确切地理解你所追求的内容有点难以理解,但有一点往往有助于分解长(ish)部分表达式,例如element[0]使代码混乱

考虑类似的事情:

here = (day, element[0])

if here == ("monday", 1):
  # Code A
elif here == ("tuesday", 2):
  # Code B

它至少有点密集,即较少重复,并且更重视重要部分,因为它"折叠"将and转换为比较元组。单词here是一个占位符,它可能应该是你的逻辑中真正有意义的东西。

答案 1 :(得分:0)

也许不是列表理解,这是人们在创建列表时所使用的。

如果你想在步骤中处理两个数据列表,那么zip()内置就是你想要的:

days = "mon tue wed thu fri sat sun".split()
daynums = range(1,7+1)

element = (6, 100)
day = "sat"

for dayname, daynum in zip(days,daynums):
    if day == dayname and element[0] == daynum:
       print "there is a match!"

答案 2 :(得分:0)

如果所有日期# code A都相同,那么

days = set(enumerate(["monday", "tuesday", ...], 1))

if (element[0], day) in days:
    # code A

答案 3 :(得分:0)

如果我正确阅读了您的问题,那么如果日期名称的索引与元素[0]的值匹配,则需要运行代码A.如果是这样,那么这就是您想要的:

#! /usr/bin/env python

def main():

    weekdays = ["monday", "tuesday", "wednesday",
        "thursday", "friday", "saturday", "sunday"]

    #Build a set of (daynumber, dayname) tuples
    day_elements = set(enumerate(weekdays, 1))

    #Print day_elements to check that it's what we want
    for i,v in day_elements:
        print i, v
    print

    #................

    day = "thursday"
    element = [4]

    if (element[0], day) in day_elements:
        print "Calling code A"
    else:
        print "Whoops!"


if __name__ == "__main__":
    main()