Python oneliner初始化字典[重复]
Posted
技术标签:
【中文标题】Python oneliner初始化字典[重复]【英文标题】:Python oneliner to initialize a dictionary [duplicate] 【发布时间】:2018-07-14 13:11:18 【问题描述】:我正在寻找一种简短而紧凑的单行代码来从 Python 中的列表初始化字典。是否有与下面两个构造等效的?
dic =
for elt in list:
dic[elt.hash] = elt
.
dic2 =
defaultValue = 0
for elt in list:
dic2[elt] = defaultValue
我已经看到Counter
用于第二种情况,但这是一个非常狭窄的情况,我正在寻找通用语法。
【问题讨论】:
第二个例子不是通过字典理解优化构建的。dict.fromkeys
或collections.defaultdict
更适合这里。
【参考方案1】:
实例化字典的三个 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。函数相关的键和值。
要构建通过函数链接键和值的字典,请使用字典理解,例如 described in detail by @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
【讨论】:
【参考方案2】:嗯,字典理解是单行的,你是这个意思吗?
>> 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'
【讨论】:
【参考方案3】:使用 dict
构造函数、map
和 zip
的 case-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
【讨论】:
【参考方案4】:这两个结构可以使用dictionary comprehensions 来构建,例如:
代码:
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
【讨论】:
以上是关于Python oneliner初始化字典[重复]的主要内容,如果未能解决你的问题,请参考以下文章