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])

更新:私の値はリストのリストになる辞書でこれを行うことが可能であることを認識していますが、主に、上記で概説したように私の思考の流れに従ってこれをコーディングするPythonicな方法があるかどうかに興味があります.

4

5 に答える 5

6

defaultdict個々の値の束の代わりに使用します。

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

うん、辞書を使えばいい。しかし、あなたの質問に答えるには、 を使用する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()したがって、辞書を使用できます。

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

怒鳴る人もいますが、なぜ彼らが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 に答える