我通过读取文件中制表符分隔的值(每行一个列表)来生成 6 项列表。一些制表符分隔的值是空的(零长度)或不存在的(例如,一行只有 4 个值)。对于这种情况,我可以使用 if-else 循环来使新列表的元素采用我在“模板”列表中定义的某些默认值,但最简单的方法是什么?
template_list = [0, 0, 'X', 0, 'Y', 'Z']
...
new_data = line.strip().split('\t')
...
new_list = new_data
将行拆分为字段(例如源自 csv.reader)可以将其缩减为单行列表理解。
template_tuple = (0, 0, 'X', 0, 'Y', 'Z')
template_tuple_len = len(template_tuple)
def extract_normalized_fields_from_row(row):
split_row = row.strip().split('\t')
return [v if len(v) else template_tuple[i] for (i, v) in enumerate(
split_row + [''] * (template_tuple_len - len(split_row)))]
for row in (
'\t'.join(('1', '2', '3', '4', '5', '6')),
'\t'.join(('1', '', '3', '4', '5', '6')),
'\t'.join(('1', '2', '3', '4'))
):
print extract_normalized_fields_from_row(row)
看起来有点不安,下面的代码部分只是用来右填充 split_row 与任何数量的空字符串元素是必要的,它的长度等于 template_tuple 的长度。这假设所有行字段,包括从短行中提取的字段,都相对于 template_tuple 左对齐。
split_row + [''] * (template_tuple_len - len(split_row))
输出:
['1', '2', '3', '4', '5', '6']
['1', 0, '3', '4', '5', '6']
['1', '2', '3', '4', 'Y', 'Z']
另一种选择,对我的味觉来说有点太浓了,产生相同输出的单线:
template_tuple = (0, 0, 'X', 0, 'Y', 'Z')
template_tuple_len = len(template_tuple)
for row in (
'\t'.join(('1', '2', '3', '4', '5', '6')),
'\t'.join(('1', '', '3', '4', '5', '6')),
'\t'.join(('1', '2', '3', '4'))
):
print [v if len(v) else template_tuple[i] for split_row in
(row.strip().split('\t'),) for (i, v) in enumerate(
split_row + [''] * (template_tuple_len - len(split_row)))]
template_list = [0, 0, 'X', 0, 'Y', 'Z']
def read_from(line):
new_data = line.split('\t',5)
full_data = []
i = 0
for a in new_data:
if len(a) < 1:
a = template_list[i]
i = i + 1
full_data.append(a)
return full_data
# I assumed that you have 5 tab delimeters for your 6 items but
# some of the locations have no data between delimiters
# and the intent is that they then take a default value
print read_from('11\t\tV\t4\t\tT')
print read_from('\t42\tR\t3\tV\tT')
print read_from('\t\t\t\t\t')
样本输出:
['11', 0, 'V', '4', 0, 'T']
[0, '42', 'R', '3', 'V', 'T']
[0, 0, 'X', 0, 'Y', 'Z']