用键值和没有对应值初始化python中的字典


76

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

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

然后我可以设置它们:

Definition[key] = something

我只想初始化键,但是直到以后必须设置它们时,我才知道相应的值。基本上,我知道要添加找到值的键。谢谢。


1
为什么要初始化密钥?
SeçkinSavaşçı

6
没有字典中没有值的键之类的东西。不过,您可以将值设置为“无”。
BrenBarn

定义没有值的键是什么意思?如果您尝试访问该项目,它会产生错误(好像您从未定义过该键一样),还是产生某些东西(在这种情况下,它的值就是它)?
Scott Hunter

由于您知道以后将要替换这些值,因此将它们设置为什么也没关系。
Mark Ransom

我正在创建一个字典,该字典将通过另一个字典以仅获取所需的键的值,因此我希望能够比较键,然后在键相等时对其进行设置。可能是一种不好的方法,但它可以工作!再次感谢!
user2989027

Answers:


63

您可以将它们初始化为None


4
或者,如果“无”是一个或多个键值元组的合法值,则可以使用“ SENTINEL = object()”之类的东西,并将SENTINEL用作您的哨兵值,并使用“ is”而不是“ ==”进行测试。
dstromberg

是的,同意,查看您的整体数据范围,确定永远不可用的价值。-1,false,none,随机int,随机字符串等。
2015年

使用None会导致'NoneType' object does not support item assignment错误...
Markus

1
@Markus:当尝试执行诸如Definition[key] = somethingwhen Definitionis None不是此处提倡的事情)而不是when Definition[key]is None(that)时,会发生这样的错误。
Scott Hunter

91

使用该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)

6
使用dict.fromkeys(...,default_value)时,请确保default_value不是需要构造函数的类型(例如列表),否则您将在所有存储桶中获得对同一对象的引用。
安东·特奥多

10

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

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

8

最好了解您的用途,为什么首先要初始化密钥。我不确定您根本不需要这样做。

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))

4

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

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


1

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

# 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}

0

根据@ 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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.