1

我有一个名为的文本文件test.txt,其中包含这种格式的数据

....
a|b|c|d|e
a1|b2|c3|d4|e5
a3|b5|c2|d1|e3
....

我想将每列的值放入列表中:像这样

list1=[a,a1,a3]
list2=[b,b2,b5]

我设法通过这样做来完成这项工作:

list1,list2,list3,list4,list5 = ([] for i in range(5))

for line in open('test.txt','r'):
    temp=line.split('|')
    list1.append(temp[0])
    list2.append(temp[1])
    list3.append(temp[2])
    list4.append(temp[3])
    list5.append(temp[4].strip())

是否有更短的方法将值附加到每个列表?我只能想到为上面的每个列表使用 1 行。

4

2 回答 2

2

zip()你的朋友在这里吗:

list1, list2, list3, list4, list5 = zip(
    *(line.strip().split('|') for line in open('test.txt')))

作为额外的好处,即使您不知道有多少列,您也可以使用它 - 只需将其分配给单个变量,您将获得一个列表,其中的每个项目都是列的值:

column_values = zip(*(line.strip().split('|') for line in open('test.txt')))
# column_values[0] is [a,a1,a3] ...

让我们一步一步来。首先,我们来看看这个zip()位会发生什么:

list1, list2, list3, list4, list5 = zip(
    [0,1,2,3,4], [0,1,2,3,4], [0,1,2,3,4])

结果list1 = [0,0,0]以此类推,因为zip()从每个列表中获取第一个元素并将其作为结果的第一个元素放入列表中。


现在,我们如何zip(a,b,c)从一个序列中得到[a,b,c]?很简单:我们使用*位置参数扩展运算符。zip(*L)是一样的zip(L[0], L[1], ...)


最后,我们如何获取需要传入的列表列表呢?我们使用生成器表达式:

(line.strip().split('|') for line in open('test.txt'))

创建一个生成器,该生成器生成每行中的项目列表,一次一行(并从项目中去除空格)。这正是我们需要提供的zip()才能获得我们想要的结果。

于 2013-06-17T02:25:17.220 回答
0

您可以使用列表列表:

table = [[] for i in range(5)]

with open('test.txt', 'r') as handle:
    for line in handle:
        for index, value in enumerate(line.strip().split('|')):
            table[index].append(value)

因此,您只需通过 , 等访问单元格,而不是拥有list1,等。list2table[0][0]table[2][1]

于 2013-06-17T02:24:39.097 回答