Избегание переменных как имен переменных или списков в Python - PullRequest
0 голосов
/ 31 марта 2012

Я хотел бы прочитать несколько текстовых файлов, имеющих следующую структуру:

3 560
7 470
2 680
4 620
3 640
...

В первом столбце указаны условия поведенческого эксперимента, время реакции второго столбца. Что я хотел бы сделать, это создать массив / список для каждого условия, который содержит время реакции только для этого условия. Я ранее использовал Perl для этого. Поскольку существует много разных условий, я хотел избежать написания множества отдельных операторов elsif и поэтому использовал имя условия в имени массива:

push(@{condition.${cond}}, $rt);  # $cond being the condition, $rt being the reaction time

Например, создать массив следующим образом:

@condition3 = (560, 640,...);

Поскольку я заинтересовался Python, я хотел посмотреть, как я смогу это сделать с помощью Python. Я нашел несколько ответов, не одобряющих использование переменных в именах переменных, но должен признать, что из этих ответов я не смог вывести, как я буду создавать списки, как описано выше, не возвращаясь к отдельным elif для каждого условия. Есть ли способ сделать это? Любые предложения будут с благодарностью!

Thomas

Ответы [ 4 ]

4 голосов
/ 31 марта 2012

Словарь был бы хорошим способом сделать это.Попробуйте что-то вроде этого:

from collections import defaultdict

conditions = defaultdict(list)

for cond, rt in data:
    conditions[cond].append(rt)
3 голосов
/ 31 марта 2012

Следующий код читает файл data.txt в формате, который вы описали, и вычисляет словарь с временем реакции на эксперимент:

experiments = {}
with open('data.txt', 'r') as f:
    data = [l.strip() for l in f.readlines()]
for line in data:
    index, value = line.split()
    try:
        experiments[int(index)].append(value)
    except KeyError:
        experiments[int(index)] = [value]
print experiments
# prints: {2: ['680'], 3: ['560', '640'], 4: ['620'], 7: ['470']}

Теперь вы можете получить доступ к времени реакции на эксперимент, используя experiments[2], experiments[3] и так далее.

1 голос
/ 31 марта 2012

Я не уверен в вашем вопросе о том, почему вы думаете об использовании условий elif.

Если вы храните список целых чисел в словаре, ключом являются значения первого столбца a.k.a значения условия, а его соответствующее значение - список времен реакции.

Например: Диктовка будет такой:

conditions['3'] -> [560, 640, ...]
1 голос
/ 31 марта 2012

Это идеальное приложение для словаря, похожего на хэш Perl:

data = {}
with open('data.txt') as f:
    for line in f:
        try:
            condition, value = map(int, line.strip().split())
            data.setdefault(condition, []).append(value)
        except Exception:
            print 'Bad format for line'

Теперь вы можете получить доступ к различным условиям, индексируя data:

>>> data
{2: [680], 3: [560, 640], 4: [620], 7: [470]}
>>> data[3]
[560, 640]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...