【问题标题】:Initializing a dictionary in python with a key value and no corresponding values用键值和没有对应值的python初始化字典
【发布时间】:2013-12-03 11:39:41
【问题描述】:

我想知道是否有一种方法可以在 python 中使用键初始化字典,但在我设置它们之前没有对应的值。如:

Definition = {'apple': , 'ball': }

然后我可以设置它们:

Definition[key] = something

我只想初始化键,但我不知道对应的值,直到我必须稍后设置它们。基本上我知道我想在找到值时添加哪些键。谢谢。

【问题讨论】:

  • 为什么要初始化密钥?
  • 在字典中没有没有值的键这样的东西。不过,您可以将值设置为 None。
  • 定义一个没有值的键是什么意思?如果您尝试访问该项目,它会产生错误(好像您从未定义过该键),还是产生某些东西(在这种情况下,某些东西就是它的值)?
  • 既然您知道稍后将替换这些值,那么将它们设置为什么并不重要。
  • 我正在创建一个字典,它通过另一个字典只获取我想要的键的值,所以我希望能够比较键,然后在它们相等时设置它们。可能是一个糟糕的方式,但它的工作原理!再次感谢!

标签: python dictionary initialization key


【解决方案1】:

使用fromkeys 函数以任何默认值初始化字典。在您的情况下,您将使用 None 进行初始化,因为您没有记住默认值。

empty_dict = dict.fromkeys(['apple','ball'])

这会将empty_dict 初始化为:

empty_dict = {'apple': None, 'ball': None}

或者,如果你想用None以外的一些默认值初始化字典,你可以这样做:

default_value = 'xyz'
nonempty_dict = dict.fromkeys(['apple','ball'],default_value)

【讨论】:

  • 使用 dict.fromkeys(..., default_value) 时,请确保 default_value 不是需要构造函数的类型(如列表),否则您将获得对同一对象的引用你的桶。
【解决方案2】:

您可以将它们初始化为None

【讨论】:

  • 或者如果 None 是您的一个或多个键值元组的合法值,您可以使用类似“SENTINEL = object()”的内容并使用 SENTINEL 作为您的标记值,使用“is " 而不是 "=="。
  • 是的,同意,查看您的整体数据范围并确定永远不应该获得的价值。 -1,false,none,random int,random string 等等。老问题,但仍然是最佳结果。
  • 使用None 将导致'NoneType' object does not support item assignment 错误...
  • @Markus:当DefinitionNone 时,尝试执行Definition[key] = something 之类的操作会发生这样的错误(这不是这里提倡的) ,而不是当Definition[key]None(即)。
【解决方案3】:

你可以使用默认字典。它可以让您设置字典值,而不必担心键是否已经存在。如果您访问尚未初始化的键,它将返回您指定的值(在下面的示例中,它将返回 None)

from collections import defaultdict
your_dict = defaultdict(lambda : None)

【讨论】:

    【解决方案4】:

    最好知道你的目的是什么,为什么要首先初始化密钥。我不确定你是否需要这样做。

    1)如果你想计算键的出现次数,你可以这样做:

    Definition = {}
    # ...
    Definition[key] = Definition.get(key, 0) + 1
    

    2) 如果您想稍后为您没有遇到的键获取 None (或其他值),您可以再次使用 get() 方法:

    Definition.get(key)  # returns None if key not stored
    Definition.get(key, default_other_than_none)
    

    3) 对于所有其他目的,您可以只使用预期键的列表,并检查稍后找到的键是否与这些匹配。

    例如,如果您只想存储这些键的值:

    expected_keys = ['apple', 'banana']
    # ...
    if key_found in expected_keys:
        Definition[key_found] = value
    

    或者,如果您想确保找到所有预期的密钥:

    assert(all(key in Definition for key in expected_keys))
    

    【讨论】:

      【解决方案5】:

      您可以将这些值初始化为空字符串,并在以后找到它们时填充它们。

      dictionary = {'one':'','two':''}
      dictionary['one']=1
      dictionary['two']=2
      

      【讨论】:

        【解决方案6】:

        在这种情况下理解也很方便:

        # from a list
        keys = ["k1", "k2"]
        d = {k:None for k in keys}
        
        # or from another dict
        d1 = {"k1" : 1, "k2" : 2}
        d2 = {k:None for k in d1.keys()}
        
        d2
        # {'k1': None, 'k2': None}
        

        【讨论】:

          【解决方案7】:
          q = input("Apple")
          w = input("Ball")
          Definition = {'apple': q, 'ball': w}
          

          【讨论】:

            【解决方案8】:

            根据@user2989027 的澄清评论,我认为一个好的解决方案如下:

            definition = ['apple', 'ball']
            data = {'orange':1, 'pear':2, 'apple':3, 'ball':4}
            my_data = {}
            for k in definition:
              try:
                my_data[k]=data[k]
              except KeyError:
                pass
            print my_data
            

            我尽量不在这里做任何花哨的事情。我设置了我的数据和一个空字典。然后,我遍历代表数据字典中潜在键的字符串列表。我将每个值从 data 复制到 my_data,但考虑 data 可能没有我想要的键的情况。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-11-14
              • 1970-01-01
              • 2010-12-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多