我有这样的代码(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)
答案 0 :(得分:4)
我发现这是 less 有用且可读,但你可以在一行上使用多个作业:
some_dict = {
'key5': 'value3',
'kyy6': 'value4',
}
some_dict['key1'] = some_dict['key2'] = 'value1'
some_dict['key3'] = some_dict['key4'] = 'value2'
另一种方法是构建一个扩展元组键的工厂函数:
def expand_tuple_keys(d):
result = {}
for key, value in d.iteritems():
if not hasattr(key, '__iter__'):
key = (key,)
result.update((k, value) for k in key)
return result
然后使用:
new_cool_dict = expand_tuple_keys({
('key1', 'key2'): 'value1',
('key3', 'key4'): 'value2',
'key5': 'value3',
'key6': 'value6',
})
演示:
>>> def expand_tuple_keys(d):
... result = {}
... for key, value in d.iteritems():
... if not hasattr(key, '__iter__'):
... key = (key,)
... result.update((k, value) for k in key)
... return result
...
>>> expand_tuple_keys({
... ('key1', 'key2'): 'value1',
... ('key3', 'key4'): 'value2',
... 'key5': 'value3',
... 'key6': 'value6',
... })
{'key3': 'value2', 'key2': 'value1', 'key1': 'value1', 'key6': 'value6', 'key5': 'value3', 'key4': 'value2'}
答案 1 :(得分:4)
为方便起见,您也可以反过来定义词典:
my_dict = {
'value1': ['key1', 'key2'],
'value2': ['key3', 'key4'],
'value3': ['key5']
}
然后将其转换为更有用的表示形式:
>>> dict((k, v) for (v, l) in my_dict.iteritems() for k in l)
{'key1': 'value1',
'key2': 'value1',
'key3': 'value2',
'key4': 'value2',
'key5': 'value3'}
答案 2 :(得分:3)
我建议将密钥设为元组并稍微更改for
循环,如下所示
target = "some_string_key1_key3_key5_key6"
some_dict = {
('key1', 'key2'): 'value1',
('key3', 'key4'): 'value2',
('key5',): 'value3',
('key6',): 'value6',
}
for k, v in some_dict.iteritems():
target = reduce(lambda x, y: x.replace(y, v), k, target)
print target
<强>输出强>
some_string_value1_value2_value3_value6
答案 3 :(得分:1)
反向键和值; - )
dict = {
'value1': ['key1', 'key2'],
'value2': ['key3', 'key3'],
'value3': ['key5'],
'value4': ['key6']
}
for v, ks in dict.iteritems:
for k in ks:
target = target.replace.(k, v)
鲍勃是你的叔叔(不过我可能会将k重命名为v,反之亦然