关于多键字典初始化的代码较少

时间:2014-01-16 16:14:32

标签: python python-2.7 dictionary

我有这样的代码(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)

4 个答案:

答案 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,反之亦然