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.fromkeyscollections.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 构造函数、mapzip 的 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初始化字典[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用列表元素初始化空列表Python的字典[重复]

Python列表元组集合字典的区别和相互转换

python内置函数字典(dict)

python 初学习 模拟用户登录

python-集合字典

Ruby oneliner 的正则表达式块中的单引号问题[重复]