4

我有一个包含数据的文件,我想根据第一列中的值将其分成各种列表。我确切地知道第一列中的可能值是什么,但它们没有任何好的数学进展。有没有更短的方法来编写以下代码?

x0=[]
y0=[]
x2=[]
y2=[]
x16=[]
y16=[]
# etc.

for line in file:
    words=line.split()
    if words[0] == '0':
        x0.append(words[1])
        y0.append(words[2])
    elif words[0] == '2':
        x2.append(words[1])
        y2.append(words[2])
    elif words[0] == '16':
        x16.append(words[1])
        y16.append(words[2])
    # etc.

我的思考过程如下,但我定义的字符串(x 和 y)显然是字符串,并且不引用我希望它们引用的列表。

x0=[]
y0=[]
x2=[]
y2=[]
x16=[]
y16=[]
# etc

for line in file:
    words=line.split()
    x='x'+words[0]
    y='y'+words[0]
    x.append(words[1])
    y.append(words[2])

更新:我意识到可以使用字典来执行此操作,其中我的值将是一个列表列表,但主要是我很好奇是否有一种 Python 的方式来编码这个遵循我上面概述的思路。

4

5 回答 5

6

使用 adefaultdict而不是一堆单独的值。

from collections import defaultdict
extracted_values = defaultdict(list)
for line in file:
    words = line.split()
    extracted_values['x' + words[0]].append(words[1])
    extracted_values['y' + words[0]].append(words[2])

然后你只需通过字典键而不是变量名来访问你的值。

extracted_values['x0']
extracted_values['y1']
于 2013-03-12T18:36:13.977 回答
5

建议你转

x0=[]
x2=[]
x16=[]

成一个字典:

x={'0':[], '2':[], '16':[]}

然后,您可以将各个列表引用为x['0']x['2']

特别是,您将能够for像这样重写循环:

for line in file:
    words = line.split()
    x[words[0]].append(words[1])
    y[words[0]].append(words[2])
于 2013-03-12T18:37:12.867 回答
0

您可以使用globals()字典,因此:

x0=[]
y0=[]
x2=[]
y2=[]
x16=[]
y16=[]
# etc

for line in file:
    words=line.split()
    x=globals()['x'+words[0]]
    y=globals()['y'+words[0]]
    x.append(words[1])
    y.append(words[2])
于 2013-03-12T18:47:09.333 回答
0

是的,你应该使用字典。但是要回答您的问题,您可以使用locals(),或者更灵活地,组装您想要的命令并使用eval. 例如,如果您的数据都是数字:

words = line.split()
eval("x%s.append(%s)" % (words[0], words[1]))
eval("y%s.append(%s)" % (words[0], words[2]))

请注意line.split(),即使它们仅包含数字,也会为您提供字符串。因此%s,不是%d

但无论如何,不​​要这样做。使用字典。

于 2013-03-12T19:22:10.677 回答
0

有些人会喊,但我还是不明白为什么他们不赞成使用globals()

for line in file:
    words=line.split()
    zx,zy = 'x%d' % words[0], 'y%d' % words[0]
    if zx not in globals():
        globals()[zx] = []
        globals()[zy] = []
    globals()[zx].append(words[1])
    globals()[zy].append(words[2])
于 2013-03-12T18:59:47.543 回答