如果带有模式的变量名嵌套,则为

时间:2019-07-23 10:32:27

标签: python

最近我编写了一个程序,如下所示:

empty_list = []
for row in rows:
    if row.num1 != 0:
        empty_list.extend(row.amt1)
    if row.num2 != 0:
         empty_list.extend(row.amt2)
    if row.num3 != 0:
         empty_list.extend(row.amt3)
    if row.num4 != 0:
         empty_list.extend(row.amt4)

此模式一直持续到num10。

基本上,我们一直在扩展列表,直到找到row.num {d} = 0。

我的问题是,由于变量已编号,因此我们可以以pythonic方式或循环方式进行操作。 该示例已简化。我们正在从旧的dbase格式导入旧数据。

3 个答案:

答案 0 :(得分:1)

我猜测row的类结构是这样的。

# This is a mock class
class Row:
    def __init__(self):
        self.num1 = 32
        self.num2 = 23
        self.num3 = 323
        self.num4 = 213
        self.num5 = 23
        self.num6 = 0
        self.amt1 = [20]
        self.amt2 = [320]
        self.amt3 = [320]
        self.amt4 = [340]
        self.amt5 = [30]
        self.amt6 = [330]

然后您可以像这样使用getattr

row = Row()
empty_list = []
i = 1
while (getattr(row, "num{}".format(i)) != 0):
    empty_list.extend(getattr(row, "amt{}".format(i)))
    i += 1

答案 1 :(得分:1)

import itertools
import contextlib

for row in rows:
    with contextlib.supress(AttributeError):
        for i in itertools.count(start=1):
            if getattr(row, f'num{i}') != 0:
                empty_list.extend(getattr(row, f'amt{i}'))
                break

应该工作。对于每一行,将使用getattr,直到引发AttributeError并处理下一行为止。

注意:上面的代码使用f字符串,因此您需要python 3.6+才能使用它们。如果您使用的是旧版本,只需使用.format()

答案 2 :(得分:0)

您可以尝试使用eval()功能

empty_list = []
for row in rows:
    for i in range(1, 11):
        if eval('row.num' + str(i)) != 0:
            empty_list.extend(eval('row.atm' + str(i)))