Python: 解决这个乱七八糟的 if else 结构更好

Python: Solve this messy if else structure better

我已经坚持了一段时间。我还没有真正写过这段代码,但如果我写的话,它看起来应该是这样的;

i = 0  # this is an int I get from somewhere else
s = "" # this is the string that I ultimately want to use for something
if i < 1:
    s = "string1"
elif i < 5:
    s = "string2"
elif i < 17:
    s = "string3"

等等。基本上我想分配一个不同的字符串来将不同的字符串分配给不同的间隔,并且根据我属于哪个间隔,我将相应的字符串分配给 s.

上面的例子真的很乱,expand/change 看起来很痛苦。我在想这可以用 dict 以某种方式解决,但我似乎不太明白。

如果不提供任何详细信息,就很难给您任何建议。但是,如果你想要“pythonic oneliner”,你可以去:

s = "string1" if i < 1 else ("string2" if i < 5 else "string3")

因为 python 3.7 个命令被订购。因此,您可以将阈值定义为字典的键,并将它们 link 定义为字符串:

D = {1: 'string1',
     5: 'string2',
     17: 'string3'}

x = 10
s = ""
for i in D.keys():
    if x < i:
        s = D[i]
        break

这样你就可以得到定义并节省一些 if

如果您以正确的顺序定义具有限制值的字典,您可以使用简单的生成器理解来提取下一个更高的元素:

map_max_string = {1: "string1", 5: "string2", 17: "string3"}
s = next(val for key, val in map_max_string.items() if i < key)

如果你不想依赖字典有序的假设,你当然仍然可以按键排序:

s = next(val for key, val in sorted(map_max_string.items()) 
         if i < key)