如何确定字典中的键是否已经设置为非 None 值?
如果已经存在值,则将其增加;否则将其设置为 1:
my_dict = {}
if my_dict[key] is not None:
my_dict[key] = 1
else:
my_dict[key] += 1
如何确定字典中的键是否已经设置为非 None 值?
如果已经存在值,则将其增加;否则将其设置为 1:
my_dict = {}
if my_dict[key] is not None:
my_dict[key] = 1
else:
my_dict[key] += 1
您正在寻找 collections.defaultdict
(适用于 Python 2.5+)。这是一个
from collections import defaultdict
my_dict = defaultdict(int)
my_dict[key] += 1
会做你想要的事情。
对于普通的Python dict
,如果没有给定键的值,则在访问该字典时您将不会得到None
,而是会引发一个KeyError
错误。因此,如果您想使用普通的dict
,而不是您的代码,您应该使用:
if key in my_dict:
my_dict[key] += 1
else:
my_dict[key] = 1
my_dict[key] = my_dict.get(key, 0) + 1
来实现。 - minmaxavg我更喜欢用一行代码完成这个操作。
my_dict = {}
my_dict[some_key] = my_dict.get(some_key, 0) + 1
字典有一个名为 get 的函数,它接受两个参数——你想要的键和默认值(如果该键不存在)。我更喜欢这种方法而不是 defaultdict,因为你只需要在这一行代码中处理键不存在的情况,而不是在任何其他地方都要处理。
defaultdict
是 Python 标准库的一部分(https://docs.python.org/3/library/collections.html)。因此无需安装! - François Leblanc我个人喜欢使用setdefault()
my_dict = {}
my_dict.setdefault(some_key, 0)
my_dict[some_key] += 1
setdefault
非常棒。如果已经为some_key
设置了值,则不会更改该值。例如,d={1:2}; d.setdefault(1, 0)
不会影响d[1]
的值。 - wsaleemself.site_included.setdefault(i, [])
接着 self.site_included[i].append(self.post_index)
是有效的。 - WinEunuuchs2Unixkey in dict
来完成这个目标。if key in my_dict and not (my_dict[key] is None):
# do something
else:
# do something else
不过,你应该考虑使用 defaultdict
(正如 dF 建议的那样)。
my_dict[key] is not None
,这样更清晰明了(至少在我的看法中是这样)。 - brandizziif key in my_dict and my_dict[key]:
- Rob Grant为了回答问题“如何找出在字典中给定索引是否已被设置为非None值”,我更喜欢这种方法:
try:
nonNone = my_dict[key] is not None
except KeyError:
nonNone = False
这符合已经引入的 EAFP (宁愿请求宽恕,而不是事先获得许可) 的概念。它还避免了在字典中进行重复键查找,因为它在key in my_dict and my_dict[key] is not None
中会出现,如果查找代价昂贵,这一点非常有趣。
对于你提出的实际问题,即如果存在则增加一个整数,否则将其设置为默认值,我也建议使用
my_dict[key] = my_dict.get(key, default) + 1
就像Andrew Wilkinson的回答中所述。
如果你在字典中存储可修改对象,则有第三种解决方案。一个常见的例子是multimap,其中为键存储元素列表。在这种情况下,你可以使用:
my_dict.setdefault(key, []).append(item)
如果字典中不存在键的值,setdefault方法将把它设置为第二个参数。这与标准的my_dict[key]行为一样,返回该键的值(可能是新设置的值)。我同意 cgoldberg 的观点。我是这样做的:
try:
dict[key] += 1
except KeyError:
dict[key] = 1
所以要么按照上述方式操作,要么像其他人建议的一样使用默认字典。不要使用 if 语句,这不是 Python 风格。+=2
或者-=1
怎么办?你必须记得同时更改这两行。现在可能看起来微不足道,但这些是那种愚蠢的小“微不足道”的错误,它们会回来咬你。 - Cam Jackson从众多答案中可以看出,有几种解决方法。一种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
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
defaultdict(int)
,但具有一些额外的功能,因此在处理纯整数时可以完美地工作,但您没有显示任何相关行为。 - Tadhg McDonald-Jensen