【问题标题】:How to (not) repeat code lines with simple iterative variations?如何(不)重复具有简单迭代变化的代码行?
【发布时间】:2018-11-05 01:25:25
【问题描述】:

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

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/3 的循环变量?
  • 为什么不直接使用数组?
  • 循环如何初始化列表?
  • 什么是stats?请提供一个最小的示例,我可以直接将其粘贴到我的解释器中并运行,而无需提供外部输入。

标签: python


【解决方案1】:

您可以使用字典,例如:

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?

【讨论】:

    【解决方案2】:

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

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

    但这很复杂。鉴于信息有限,您的用例是列表列表的教科书用例:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      相关资源
      最近更新 更多