在Python中避免变量作为变量或列表名称

时间:2012-03-30 21:32:16

标签: python variables dynamic

我想阅读一些具有以下结构的文本文件:

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。有没有办法做到这一点?任何建议将不胜感激!

托马斯

4 个答案:

答案 0 :(得分:4)

字典是一种很好的方法。尝试这样的事情:

from collections import defaultdict

conditions = defaultdict(list)

for cond, rt in data:
    conditions[cond].append(rt)

答案 1 :(得分:3)

以下代码使用您描述的格式读取文件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]等访问每个实验的反应时间。

答案 2 :(得分:1)

这是一个完美的字典应用程序,类似于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]

答案 3 :(得分:1)

我不确定你的问题,为什么你会考虑使用elif条件。

如果在字典中存储整数列表,则键为第一列a.k.a条件值的值,其对应值为反应时间列表。

例如: dict就像:

conditions['3'] -> [560, 640, ...]