Использование имени списка в виде строки для доступа к списку

У меня есть файл с данными, которые я хочу разделить на разные списки в зависимости от значения в первом столбце. Я точно знаю, каковы возможные значения в первом столбце, но они не в какой-либо хорошей математической прогрессии. Есть ли более короткий способ написать следующий код?

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

Обновление: я понимаю, что это можно сделать со словарем, где мое значение будет списком списков, но в основном мне любопытно, есть ли питонический способ кодировать это, что следует за моим движением мыслей, как описано выше.

Используйте параметр defaultdict вместо 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'] 

Я предлагаю вам повернуть

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

Некоторые люди будут кричать, но я до сих пор не понимаю, почему они недовольны использованием 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]) 

Вы можете использовать словарь 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]) 

Да, вы должны использовать словарь. Но чтобы ответить на ваш вопрос, вы можете использовать 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 .

Но так или иначе, не делайте этого. Используйте dict.