题
由于一本字典,我怎么能发现如果在字典中的给定的密钥已经被设置成非无的价值?
即,我想这样做:
my_dict = {}
if (my_dict[key] != None):
my_dict[key] = 1
else:
my_dict[key] += 1
即,我想递增值,如果有一个已经存在,或者将其设置为1,否则
解决方案
您正在寻找 collections.defaultdict
(可用于Python 2.5 +)。此
from collections import defaultdict
my_dict = defaultdict(int)
my_dict[key] += 1
会做你想要什么。
有关常规的Python dict
s,如果没有价值对于给定的密钥,您的不的访问字典时获得None
- 一个KeyError
将提高。所以,如果你想使用一个普通dict
,而不是你的代码,你会使用
if key in my_dict:
my_dict[key] += 1
else:
my_dict[key] = 1
其他提示
我更喜欢这样做在一个代码行。
my_dict = {} my_dict[some_key] = my_dict.get(some_key, 0) + 1
字典有一个函数,拿,这需要两个参数 - 您想要的关键,如果它不存在默认值。我喜欢这种方法来defaultdict,你只需要处理其中的关键并不在这一行代码的存在,不是到处如此。
我个人喜欢使用setdefault()
my_dict = {}
my_dict.setdefault(some_key, 0)
my_dict[some_key] += 1
您需要的key in dict
成语。
if key in my_dict and not (my_dict[key] is None):
# do something
else:
# do something else
但是,你应该考虑使用defaultdict
(如DMF建议)。
要回答这个问题“的我怎么能发现如果在字典给定的指标已经设定到非无值的”,我宁愿这样的:
try:
nonNone = my_dict[key] is not None
except KeyError:
nonNone = False
这符合EAFP的已经调用概念(更容易请求原谅,然后权限)。这也避免了在字典中的重复键查找,因为它会在key in my_dict and my_dict[key] is not None
什么是有趣的,如果查找是昂贵的。
有关的实际的问题你已经提出,即递增的int(如果存在),或以其他方式将其设置为默认值,我还推荐
my_dict[key] = my_dict.get(key, default) + 1
如安德鲁威尔金森的答案。
有第三种解决方案,如果你是存储在你的字典modifyable对象。这样做的一个常见的例子是多重映射,在那里你存储你的钥匙元素的列表。在这种情况下,可以使用:
my_dict.setdefault(key, []).append(item)
如果对密钥的值不存在于字典中,setDefault方法将其设置为setdefault的第二个参数。它的行为就像一个标准my_dict [键],对于键返回值(其可以是新设置的值)。
与cgoldberg同意。我如何做到这一点是:
try:
dict[key] += 1
except KeyError:
dict[key] = 1
因此,无论这样做如上,或使用默认字典作为其他人所说。 if语句不要使用。这不是Python化。
你可以从很多答案看,有几种解决方案。 LBYL(三思而后行)还未被提及的一个实例,该对象的has_key()方法:
my_dict = {}
def add (key):
if my_dict.has_key(key):
my_dict[key] += 1
else:
my_dict[key] = 1
if __name__ == '__main__':
add("foo")
add("bar")
add("foo")
print my_dict
您正在试图做到这一点的方法称为LBYL(三思而后行),因为你想增加你的价值之前检查的条件。
另一种方法被称为EAFP(更容易请求原谅然后权限)。在这种情况下,你只尝试操作(增加值)。如果失败,你捕获该异常并将其值设置为1。这是做它(IMO)稍微更Python的方式。
http://mail.python.org/pipermail /python-list/2003-May/205182.html
一个有点晚,但这应该工作。
my_dict = {}
my_dict[key] = my_dict[key] + 1 if key in my_dict else 1
这是没有直接回答这个问题,但对我来说,它看起来像你可能想的 collections.Counter 。
from collections import Counter
to_count = ["foo", "foo", "bar", "baz", "foo", "bar"]
count = Counter(to_count)
print(count)
print("acts just like the desired dictionary:")
print("bar occurs {} times".format(count["bar"]))
print("any item that does not occur in the list is set to 0:")
print("dog occurs {} times".format(count["dog"]))
print("can iterate over items from most frequent to least:")
for item, times in count.most_common():
print("{} occurs {} times".format(item, times))
这导致输出
Counter({'foo': 3, 'bar': 2, 'baz': 1})
acts just like the desired dictionary:
bar occurs 2 times
any item that does not occur in the list is set to 0:
dog occurs 0 times
can iterate over items from most frequent to least:
foo occurs 3 times
bar occurs 2 times
baz occurs 1 times
下面就是我想出了最近为解决这个问题需要一行代码。它是基于在 setdefault 字典方法:
my_dict = {}
my_dict[key] = my_dict.setdefault(key, 0) + 1
我正在寻找时,没发现它的网络,然后想我的运气尝试/错误,并发现它
my_dict = {}
if my_dict.__contains__(some_key):
my_dict[some_key] += 1
else:
my_dict[some_key] = 1