0

我通过读取文件中制表符分隔的值(每行一个列表)来生成 6 项列表。一些制表符分隔的值是空的(零长度)或不存在的(例如,一行只有 4 个值)。对于这种情况,我可以使用 if-else 循环来使新列表的元素采用我在“模板”列表中定义的某些默认值,但最简单的方法是什么?

template_list = [0, 0, 'X', 0, 'Y', 'Z']
...
new_data = line.strip().split('\t')
...
new_list = new_data

4

2 回答 2

1

将行拆分为字段(例如源自 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)))]
于 2013-09-02T23:45:32.930 回答
1
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']

于 2013-09-03T00:52:04.437 回答