如何(不)以简单的迭代方式重复代码行?

时间:2018-11-04 16:46:52

标签: python

我正在检查一些不同类别的平均值

cat_1 = []

for i, j, k in zip(is, js, ks):    
    if i == 1:
        cat_1.append(i)

avg_cat_1 = stats.mean(cat_1)
print("Avg for cat_1:", avg_cat_1)

如果要包括多个类别,我希望避免为每个新类别写一行新行。

对于列表的初始化,我可以这样做:

for i in range(nr of categories): 
    a = "cat_%s" % (i)
    print (a)

但是那当然只会打印我一行,并且不会执行一行,而if语句则更复杂。

我想知道是否有一种方法可以执行这样的循环:

for i in range(nr of categories): 
    cat_i = []

for i in range(nr of categories): 
    cat_%s = [] %(i)

其中“ i”不是被识别为变量字符串的一部分,而是被识别为临时循环变量,并且仅产生可执行代码行,而不仅仅是打印输出

2 个答案:

答案 0 :(得分:0)

有一种方法可以按名称查找变量。说全局变量:

globals()[f'cat_{i}'] = 9

但这令人费解。鉴于信息有限,您的用例是列表列表的教科书用例:

for i in range(num_of_categories):
    cat[i].append(some_operation(i))

答案 1 :(得分:0)

您可以使用字典,例如:

cat_dict = {'cat_1': cat_1, 'cat_2': cat_2, 'cat_3': cat_3, ... }
for i in range(1, number_of_categories + 1):
    cat_dict['cat_%s' % i] = []

还有不推荐的方法:您可以使用exec

for i in range(1, number_of_categories + 1):
    exec('cat_%s = []' % i)

一个很简单的原因,那就是清晰度。如果用户想查看变量cat_3的创建位置,则可以在文件中搜索cat_3,但是此时找不到。

有关不良做法的列表,请参见Why is using 'eval' a bad practice?