由于一本字典,我怎么能发现如果在字典中的给定的密钥已经被设置成非无的价值?

即,我想这样做:

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 dicts,如果没有价值对于给定的密钥,您的的访问字典时获得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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top