【问题标题】:dictionary of lists of dictionaries in pythonpython中的字典列表字典
【发布时间】:2014-10-15 16:51:09
【问题描述】:

我是一个在 python 中工作的 perl 脚本编写者,需要知道一种在 python 中执行以下 perl 的方法。

$Hash{$key1}[$index_value]{$key2} = $value;

我在这里看到了stackoverflow问题:List of dictionaries, in a dictionary - in Python

我仍然不明白 self.rules 正在做什么,或者它是否适用于我的解决方案。

我的数据将来自文件,我将使用正则表达式捕获临时变量,直到准备好存储在数据结构中。如果您需要询问,与$index_value 相关的顺序很重要,希望保持为整数。

感谢任何建议,或者如果您认为我需要用 Python 重新考虑数据结构,这会有所帮助。

【问题讨论】:

  • 你到底想做什么?您是否已经有一个 dicts 列表的 dict 并且您只需要分配给它?你需要初始化结构吗?遍历元素时是否需要添加到结构中?
  • @RogerFan 我需要初始化结构,我需要添加到结构中。假设对于文件的每一行,我都捕获了键、索引和数据值。我将第一行放在字典列表的字典中,在第二行我做同样的事情,等等。这对我想要做的事情有帮助吗?
  • @Andy:索引每次都加一吗?
  • @unutbu 是的,我希望它的行为就像一个常规列表,只是它们是字典而不是值。

标签: python perl python-2.7


【解决方案1】:

您希望 h 成为字典(h 因为 hash 是 Python 内置的):

h = {}

现在,h[key] 应该是一个列表(对于一些合适的key):

key = 'key'
L = h[key] = []

我将L 设置为引用h[key],以便接下来的解释更容易。

现在,L 的每个元素都是一个字典:

value1 = {'key2': 42, 'key3': 6*9}
L.append(value1)
value2 = {'key3': 'some other value'}
L.append(value2)

现在,您可以按照自己的方式索引h

h[key][0]['key2']
h[key][1]['key3']

你可以追加到列表中:

h[key].append({})

等等

这是你想要的吗?

【讨论】:

  • 看来这是他需要的。我只想添加更多细节,因为 OP 是一个 perl 人:Python 等价于 perl 哈希是字典。在 perl 中,您通过 $hash{'key'} 或 $hash->{'key'} 访问哈希值,但在 python 中,您使用 dict['key']。因此,您基本上对列表(~perl 数组)和字典(~ perl 哈希)都使用方括号,区别在于括号内的内容。对于字典,它是键,对于列表,它是索引。
  • @user3885927 好的...我认为这是有道理的,但是我可能需要重新考虑,因为我正在使用 stackoverflow-er nosklo 的 AutoVivification 类来模仿 Perl 的哈希功能。在 python 中创建这个结构的正确方法是什么。编辑:所以说我在变量中有所有四个信息,我将如何添加它。谢谢-安迪
  • @Andy,我假设您正在询问“$Hash{$key1}[$index_value]{$key2} = $value;”的等价物如果 a 是您的 AutoVivification 对象,您只需执行 a[key1][index_value][key2]=value。
  • @user3885927 我问 $Hash{$key1}[$index_value]{$key2} = $value 的等价物,我刚刚在创建 dicts 的 dict 并来自 perl 时看到了一些东西类的行为类似于哈希的 perl 哈希。根据这里的 cmets,我需要放弃这个课程。并尝试上述方法之一。
【解决方案2】:

直接 Python 等价于:

$Hash{$key1}[$index_value]{$key2} = $value;

如下:

Hash[key1][index_value][key2] = value

不幸的是,在 Python 中,与 Perl 不同,当 key1Hash 中不存在或 index_value 超出 Hash[key1] 的范围时,这将不起作用。要处理这两种情况,您需要执行以下操作:

lst1 = Hash.setdefault(key1, [])
if index_value >= len(lst1):
    for _ in range(len(lst1), index_value+1):
        lst1.append({})
lst1[index_value][key2] = value

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多