python嵌套循环对nulls/blanks非常健壮



下面是我的数据片段:

[
['2002','','28','102','5'],
['2003','32','15','88','2'],
]

一年之后是四种可能的类型:A、B、C、D,我想循环浏览每一个,这样我就可以得到一个"长"形式的数据,例如:

{'year':'2002','type':B}x28 (28 of these)
{'year':'2002','type':C}x102
{'year':'2002','type':D}x5

等等;请注意,应该跳过第一次出现的A,因为它有一个空白。

我得到了:

基为10的无效文字int((:">

这很奇怪,因为我确保使用int():将读出值转换为int

master_array = []
for i in range(len(tsv_data)):
for j in range(int(tsv_data[i][1])):
temp = {}
temp['type']='A'
master_array.append(temp)

我只是继续尝试:

master_array = []
for i in range(len(tsv_data)):
try:
for j in range(int(tsv_data[i][1])):
temp = {}
temp['type']='A'
temp['year']=tsv_data[i][0]
master_array.append(temp)
except:
try:
for j in range(int(tsv_data[i][2])):
temp = {}
temp['type']='B'
temp['year']=tsv_data[i][0]
master_array.append(temp)
except:
try:
for j in range(int(tsv_data[i][3])):
temp = {}
temp['type']='C'
temp['year']=tsv_data[i][0]
master_array.append(temp)
except:
for j in range(int(tsv_data[i][4])):
temp = {}
temp['type']='D'
temp['year']=tsv_data[i][0]
master_array.append(temp)

它运行了,但它只给了我实际列表的一小部分。我所期望的行为是try/except跳过所有带空格的单元格,并在带值的单元格上迭代。

问题

我如何读取每个单元格中的值,并将它们用作master_array的迭代提示,并对空格具有鲁棒性?

结果应该是每年一项,并根据值进行类型配置。

只有在值为实际数字时才采用范围。这是一个更简单可读的实现。

master_array = []
for y, a, b, c, d in tsv_data:
if a.isdigit():
master_array.extend([{"year": y, "type": "A"} for _ in range(int(a))])
if b.isdigit():
master_array.extend([{"year": y, "type": "B"} for _ in range(int(b))])
if c.isdigit():
master_array.extend([{"year": y, "type": "C"} for _ in range(int(c))])
if d.isdigit():
master_array.extend([{"year": y, "type": "D"} for _ in range(int(d))])

你可以用更简单的真值检查来完成这项工作,但最好在转换前检查它是一个数字。

if a:  # Will work, but better to check int.
master_array.extend([{"year": y, "type": "A"} for _ in range(int(a))])

最新更新