【问题标题】:Avoiding variables as variable or list names in Python在 Python 中避免将变量作为变量或列表名称
【发布时间】:2012-04-14 14:13:55
【问题描述】:

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

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 的情况下创建如上所述的列表。有没有办法做到这一点?任何建议将不胜感激!

托马斯

【问题讨论】:

  • 太棒了!非常感谢大家的快速和详细的帮助!我没有意识到可以将值附加到字典中的现有键,因为到目前为止我看到的所有字典示例都将键与单个值相关联。
  • 字典只为每个键保存一个值,但该单个值可以是一个列表。

标签: python variables dynamic


【解决方案1】:

字典是一个很好的方法。试试这样的:

from collections import defaultdict

conditions = defaultdict(list)

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

【讨论】:

    【解决方案2】:

    以下代码以您描述的格式读取文件data.txt,并计算一个包含每个实验的反应时间的字典:

    实验 = {} 使用 open('data.txt', 'r') 作为 f: data = [l.strip() for l in f.readlines()] 对于数据行: 索引,值 = line.split() 尝试: 实验[int(index)].append(value) 除了 KeyError: 实验[int(index)] = [值] 打印实验 # 打印:{2: ['680'], 3: ['560', '640'], 4: ['620'], 7: ['470']}

    您现在可以使用experiments[2]experiments[3] 等访问每个实验的反应时间。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        如果您将整数列表存储在字典中,则键是第一列的值,即条件值,其对应的值是反应时间列表。

        例如: 字典就像:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-09
          • 2018-02-14
          • 2014-06-14
          相关资源
          最近更新 更多