Python一行代码初始化字典

4
我正在寻找一个简短紧凑的一行代码来在Python中从列表初始化字典。是否有与下面两个结构等价的方式?
dic = {}
for elt in list:
  dic[elt.hash] = elt

.

dic2 = {}
defaultValue = 0
for elt in list:
  dic2[elt] = defaultValue

我看到了在第二种情况下使用Counter,但它是非常狭窄的情况,我正在寻找通用语法。


1
第二个例子不适合使用字典推导式。在这里,使用dict.fromkeys或者collections.defaultdict更加合适。 - jpp
4个回答

7

三种Pythonic解决方案的摘要,用于实例化字典。拥有“一行代码”解决方案永远不应该是最重要的考虑因素。

1. 预先定义键和默认值。

不要为每个键设置默认值,而是使用dict.fromkeys。此外,不要将变量命名为类的名称,例如使用lst代替。

dic2 = dict.fromkeys(lst, 0)

2. 预先定义默认值,但没有键。

如果您将来会添加更多的键,请考虑使用collections.defaultdict,它是dict的子类:

from collections import defaultdict
dic2 = defaultdict(int)
dic2['newkey']  # returns 0 even not explicitly set

3. 键和值通过函数相关联。

如果要构建一个键和值通过函数相关联的字典,可以使用字典推导式,如@OmerB在这里详细描述的那样,例如:

{k: f(k) for k in lst}  # value function of given keys
{f(v): v for v in lst}  # key function of given values

4
好的,字典理解是一个一行代码的操作,你是指这个吗?
>> MyList = ['apple', 'banana', 'pear']
>> {hash(element): element for element in MyList}

{-8723846192743330971: 'pear',
 -6060554681585566095: 'banana',
 -4133088065282473265: 'apple'}

此外,我怀疑使用元素的哈希作为键不是您想要的:
- 如果您的元素是不可变的(例如字符串),则可以使用元素本身作为键。 - 如果它们不是不可变的,则可以使用元素在列表中的位置。
对于后者,在迭代列表之前清除重复项以确保只向字典插入每个值一次:
>> MyList = ['apple', 'apple', 'banana', 'banana', 'pear']
>> {idx: value for (idx,value) in enumerate(set(MyList))}
{0: 'banana', 1: 'pear', 2: 'apple'}

1
使用dict构造器、map和zip的案例-01的简单一句话陈述:
>>> l = ['a','b','c']
>>> dict(zip(map(hash,l),l))
>>> {12416037344: 'a', 12672038114: 'c', 12544037731: 'b'}

对于第二种情况:
>>> l = ['a','b','c']
>>> default_value = 10
>>> dict((zip(l,[default_value]*len(l))))
>>> {'a': 10, 'c': 10, 'b': 10}

0

这两个结构可以使用字典推导来构建,例如:

代码:

dic_comp = {getattr(elt, 'hash'): elt for elt in test_data}
dic2_comp = {elt: defaultValue for elt in test_data}

测试代码:

class TestObj(object):
    def __init__(self, hash_value):
        self.hash = hash_value

test_data = [TestObj(i) for i in range(5)]

dic = {}
for elt in test_data:
    dic[elt.hash] = elt

dic_comp = {getattr(elt, 'hash'): elt for elt in test_data}
assert dic == dic_comp

dic2 = {}
defaultValue = 0
for elt in test_data:
    dic2[elt] = defaultValue

dic2_comp = {elt: defaultValue for elt in test_data}
assert dic2 == dic2_comp

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