如何同时为字典赋值



当我有一个现有的字典时,我想同时为它赋值。

示例:

这是一本关于字典的样本。

people_list = {
    "Tom": None,
    "David": None,
    "Traivs": None,
}

我希望每个key:value对都有相同的值。

这是我想要的结果。

people_list = {
    "Tom": "hello",
    "David": "hello",
    "Traivs": "hello",
}

除了循环语句,我该怎么解决它?

一行:

people_list.update(dict.fromkeys(people_list.keys(),"hello"))
In [3]: {key: 'hello' for key in people_list}
Out[3]: {'David': 'hello', 'Tom': 'hello', 'Traivs': 'hello'}

与@Paul解决方案的时间比较:

In [12]: d = dict(zip(range(1, 10000), range(10000,1)))
In [13]: %timeit d2 = {key: 'hello' for key in d}
1000000 loops, best of 3: 240 ns per loop
In [14]: %timeit d.update(dict.fromkeys(d.keys(),"hello"))
1000000 loops, best of 3: 844 ns per loop

从技术上讲,它仍然是一个循环,但您可以使用迭代器:

new_value = None
dict(map(lambda (k,v): (k, new_value), people_list.iteritems()))

如果您想要一个具有相同值的字典,也可以使用defaultdict

>>> from collections import defaultdict
>>> people_list = defaultdict(lambda: "hello")
>>> print people_list["Tom"]
'hello'
>>> print people_list["Davis"]
'hello'
>>> print people_list["Travis"]
'hello'

密钥/值对是按需创建的。

没有一种神奇的方法可以在不进行某种形式的迭代的情况下,以您请求的方式同时设置字典中的所有不可变值。

可能最接近的是使用dict.fromkeys():

people_list = dict.fromkeys(people_list, 'hello')

当然,尽管迭代仍在fromkeys()中进行。

如果您对间接级别感到满意,那么可以有一个具有可变值的字典,例如列表,并一次更新所有这些值:

>>> v = [None]
>>> d = {k:v for k in ['Tom', 'David', 'Traivis']}
>>> print d
{'David': [None], 'Traivis': [None], 'Tom': [None]}
>>> v[0] = 'hello'
>>> print d
{'David': ['hello'], 'Traivis': ['hello'], 'Tom': ['hello']}

这里没有循环,但缺点是必须提取值:

>>> d['Tom']
['hello']
>>> d['Tom'][0]
'hello'

最新更新