【问题标题】:Smart way to set 2 variable based on a 3rd variable values without using if [duplicate]在不使用 if [重复] 的情况下根据第三个变量值设置 2 个变量的智能方法
【发布时间】:2017-02-13 21:11:08
【问题描述】:

我有一个代码,我在whichweek 中传递一个值,然后它返回dayfdayt 的值 我正在使用 if 语句,但它很长,而且根本没有“pythonic”的感觉。有什么优雅的写法吗?

这是我的做法:

if whichweek == 5:
    dayf = 0
    dayt = 32
elif whichweek == 1:
    dayf = 0
    dayt = 8
elif whichweek == 2:
    dayf = 7
    dayt = 15
elif whichweek == 3:
    dayf = 14
    dayt = 22
elif whichweek == 4:
    dayf = 21
    dayt = 29

感谢您的帮助。

【问题讨论】:

  • 使用字典将whichweek 映射到dayf, dayt 例如mapping = {5: (0, 32), 1: (0, 8).....}

标签: python python-2.7 if-statement


【解决方案1】:
weeks = {1: (0, 8)}
try:
    dayf = weeks[1][0]
    dayt = weeks[1][1]
except (KeyError, IndexError):
    pass

【讨论】:

  • 这是迄今为止唯一实际复制 OP 定义的行为的答案。也就是说,dayfdayt 如果 whichweek 不在字典中,则不会定义。
【解决方案2】:

是的,很少有让它更pythonic的,我会使用一个字典来打包所有数据,即:

import random

if __name__ == "__main__":
    random.seed(1)

    week_data = {
        1: (0, 32),
        2: (0, 8),
        3: (7, 15),
        4: (14, 22),
        5: (21, 29)
    }

    for i in range(10):
        whichweek = random.randint(1, 5)
        dayf, dayt = week_data[whichweek]
        print whichweek, dayf, dayt

如果你想处理错误,你可以使用这样的东西:

import random

if __name__ == "__main__":
    random.seed(1)

    week_data = {
        1: (0, 32),
        2: (0, 8),
        3: (7, 15),
        4: (14, 22),
        5: (21, 29)
    }

    for i in range(10):
        whichweek = random.randint(1, 10)
        res = week_data.get(whichweek, None)

        if res is None:
            print("Error: {0} is not in week_data".format(whichweek))
        else:
            dayf, dayt = res
            print whichweek, dayf, dayt

最后,如果您想避免条件检查,请始终返回如下值:

import random

if __name__ == "__main__":
    random.seed(1)

    week_data = {
        1: (0, 32),
        2: (0, 8),
        3: (7, 15),
        4: (14, 22),
        5: (21, 29)
    }

    for i in range(10):
        whichweek = random.randint(1, 10)
        dayf, dayt = week_data.get(whichweek, (None, None))
        print whichweek, dayf, dayt

【讨论】:

  • 如果 whichweek 不是几天内的关键,您的代码将引发错误。最好使用 days.get(whichweek) 并检查是否为 None 或将括号访问调用包装在 try-except 块中。
【解决方案3】:

我会使用字典:

days = {
    5: (0, 32),
    1: (0, 8),
    2: (7, 15),
    3: (14, 22),
    4: (21, 29)
}

dayf, dayt = days[whichweek]

【讨论】:

  • 不错!如果whichweek 不在字典中,会发生什么? :)
  • 如果whichweek 不是days 中的键,您的代码将引发错误。最好使用 days.get(whichweek) 并检查是否为 None 或将括号访问调用包装在 try-except 块中。
【解决方案4】:

创建一个字典,将值whichweek 作为键映射到dayfdayt 的对应值。使用函数调用这个字典更好(我个人喜欢这些简单且面向任务的函数)

下面是示例代码:

def get_values(key):
    return {
         1: (0, 8),
         2: (7, 15),
         3: (14, 22),
         4: (21, 29)
         5: (0, 32),
     }.get(key, (None, None))

dayf, dayt = get_values(5)
# Value of 'dayf' = 0 and 'dayt' = 32 

dayf, dayt = get_values(9)
# Since '9' is not the valid key; 'dayf' = None and 'dayt' = None

如果您不想将任何值设置为 dayfdayt,如果 whichweek 具有未知值(因为我上面的解决方案是在这种情况下将 dayf 和 dayt 设置为 None),上述代码的略微更新版本将是:

def get_values(key):
    return {
        1: (0, 8),
        2: (7, 15),
        3: (14, 22),
        4: (21, 29)
        5: (0, 32),
    }[key]

try:
    dayf, dayt = get_values(5)
except KeyError:
    pass

【讨论】:

    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多