最近我编写了一个程序,如下所示:
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格式导入旧数据。
答案 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)))