Python中的字典列表字典

3
我是一名在Python中工作的Perl脚本编写者,需要知道如何在Python中执行以下Perl代码。
$Hash{$key1}[$index_value]{$key2} = $value;

我看到了这里的stackoverflow问题:Python中字典列表中的字典 我仍然不明白self.rules是做什么的,也不知道它是否适用于我的解决方案。
我的数据将来自文件,并且我将使用正则表达式捕获到临时变量,直到准备好存储在数据结构中。如果您需要询问,与$index_value有关的顺序很重要,希望保持为整数。
欢迎提出任何建议,或者如果您认为我需要重新考虑Python的数据结构,那将非常有帮助。

你到底想做什么?你已经有一个字典列表的字典了,只需要对它进行赋值吗?你需要初始化结构吗?你需要在迭代元素时添加到结构中吗? - Roger Fan
@RogerFan 我需要初始化结构并且需要向结构中添加内容。假设对于文件的每一行,我都捕获了两个键、索引和数据值。我将第一行放在字典列表的字典中,然后在第二行中执行相同的操作,以此类推。这有助于理解我要做的事情吗? - Andy
@Andy:索引每次增加一吗? - unutbu
@unutbu 是的,我希望它的行为就像常规的列表一样,只不过它们是字典而不是值。 - Andy
2个回答

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 的哈希相对应的是字典(dictionary)。在 Perl 中,你可以通过 $hash{'key'} 或者 $hash->{'key'} 访问哈希值,但在 Python 中你要用 dict['key']。所以基本上你会用方括号来操作列表(类似 Perl 数组)和字典(类似 Perl 哈希),区别在于方括号内的内容:对于字典,它是键名,而对于列表,它是索引。 - user3885927
@user3885927 好的...我认为这很有道理,但是我可能需要重新考虑,因为我正在使用stackoverflow用户nosklo的AutoVivification类来模仿Perl的哈希功能。在Python中创建此结构的正确方法是什么?编辑:假设我有所有四个信息变量,我该如何添加它们。谢谢-Andy - Andy
@Andy,我猜你是在问“$Hash{$key1}[$index_value]{$key2} = $value;”的等效写法。如果a是你的AutoVivification对象,你只需要这样写:a[key1][index_value][key2]=value。 - user3885927
@user3885927,我正在寻找$Hash{$key1}[$index_value]{$key2}的等效方法。我在创建字典时看到了一些东西,因为我来自Perl,所以这个类会像Perl中的哈希表一样运行。根据这里的评论,我需要放弃这个类,并尝试上面提到的其中一个。 - Andy

1

以下是 Python 的直接等效代码:

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

以下是:

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

不幸的是,在Python中,与Perl不同,当key1不存在于Hash中或者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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接