【发布时间】:2014-01-16 16:14:31
【问题描述】:
我有这样的代码(Python 2.7+):
target = "some_string_key1_key3_key5_key6"
some_dict = {
'key1': 'value1',
'key2': 'value1',
'key3': 'value2',
'key4': 'value2',
'key5': 'value3',
'kyy6': 'value4',
}
for k, v in some_dict.iteritems():
target = target.replace(k, v)
如您所见,有不同的键使用相同的值(key1 和 key2 / key3 和 key4)。在我的例子中,所有的键和值都是字符串。
有没有可能在字典初始化上减少代码并仍然得到
for k, v in some_dict.iteritems()
仅使用标准 python 2.7 模块的行为没有改变?
我试过multi_key_dict,但对我来说不太方便,因为语法略有不同。
我想要达到的就是这样的:
new_cool_dict = {
['key1', 'key2', ]: 'value1',
['key3', 'key4', ]: 'value2',
'key5': 'value3',
'key6': 'value6',
}
for k, v in new_cool_dict.iteritems():
target = target.replace(k, v)
【问题讨论】:
-
“new_cool_dict”方法的一个问题是
list和tuple不能互换使用。由于tuple是可散列的,因此它可以用作dict键。list实例不能。您可以编写自己的类,专门检查预期的键是否既是可迭代的又是list的实例,然后继续为list中的每个键插入键值对。 -
但是当传递
tuple时它不能以相同的方式工作,并且当键是str时可能还需要特殊处理。最后,尝试避免使用纯语法可能会增加更多的代码和开销,而不是在实际dict实例化时节省的最终微小的语法增益。 -
另一个问题是您问题顶部的
dict实例化(您不喜欢的“长”示例)可以很好地作为驻留在配置文件中的纯 Python 文字,并且几乎可以直接翻译为 Yaml 或其他序列化方法。你所做的任何改变都会以一种可能比只是稍微冗长的实例化更糟糕的方式来掩盖它。
标签: python python-2.7 dictionary