【问题标题】:Python oneliner to initialize a dictionary [duplicate]Python oneliner初始化字典[重复]
【发布时间】: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 更适合这里。

标签: python python-3.x dictionary


【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2017-11-15
          • 2016-06-04
          • 2018-05-02
          • 2018-10-22
          • 2016-02-14
          • 2014-09-23
          • 2023-03-30
          • 2012-04-27
          • 1970-01-01
          相关资源
          最近更新 更多