【问题标题】:if and elif repetitionif 和 elif 重复
【发布时间】:2019-07-10 12:34:16
【问题描述】:

我想知道是否有办法让这种类型的代码更简洁和自动化,这样我就不必一次又一次地重复 elif 语句。

ga 是从 1 到我记录的任何秒数的累积秒数列表,我想将每个小时与该小时的相应数据帧分开,有没有办法让这变得更简单?

for i in range(len(ga)):
 if ga[i]<=3600:
    j.append(i)
 elif ga[i]<=7200:
    u.append(i)
 elif ga[i]<=10800:
    k.append(i)
 elif ga[i]<=14400:
    b.append(i)
 elif ga[i]<=18000:
    bi.append(i)
 elif ga[i]<=21600:
    bit.append(i)
 elif ga[i]<=25200:
    bitb.append(i)
 elif ga[i]<=28800:
    bitc.append(i)
 elif ga[i]<=32400:
    bitd.append(i)
 elif ga[i]<=36000:
    bite.append(i)

【问题讨论】:

    标签: python-3.x computer-science custom-lists


    【解决方案1】:

    也许,它不是通用的解决方案,而是问题的基础,您可以创造性地解决。 像下面的代码

    # Put variable name in var
    # These are empty lists that have already been defined
    var = ["j", "u", "k", "b", "bi", "bit", "bitb", "bitc", "bitd", "bite"]
    for i in range(len(ga)):
        # Finding var index base of ga[i] value.
        var_index = ga[i] // 3600
        if ga[i] % 3600 == 0 and ga[i] > 0:
            var_index -= 1
        # Add the ga index to the corresponding list
        eval(var[var_index] + ".append(" + str(i) + ")")
    

    但最好使用字典而不是定义许多变量。像下面的代码。

    # Define dictionary 
    ch = {"j":[], "u":[], "k":[], "b":[], "bi":[],
          "bit":[], "bitb":[], "bitc":[], "bitd":[], "bite":[]}
    # Dictionary keys
    key = ["j", "u", "k", "b", "bi", "bit", "bitb", "bitc", "bitd", "bite"]
    for i in range(len(ga)):
        # Finding key index base of ga[i] value.
        key_index = ga[i] // 3600
        if ga[i] % 3600 == 0 and ga[i] > 0:
            key_index -= 1
        # Add the ga index to the corresponding list in the dictionary
        ch[key[key_index]].append(i)
    

    【讨论】:

    • 由于变量引用了正在发生变化的列表,您可以在 var 列表中添加对对象的额外引用,而不是将变量名称(或键放入字典) .我还建议使用whatever_index = (ga[i] - (ga[i] &gt; 0)) // 3600 来避免多余的行。如果提问者知道ga[i] 总是大于零,他们可以只做-1 而不是减去bool)。
    【解决方案2】:

    使用列表推导:

    r = [[idx for idx, val in enumerate(
        ga) if 3600*level < val <= 3600*(1+level)] for level in range(9)]
    
    (j, u, k, b, bi, bit, bitc, bitd, bite) = r
    

    【讨论】:

    • 谢谢,这似乎是最简单的解决方案