Python:检查字典是否为空的高效方法

42
如何检查字典是否为空?具体而言,我的程序从字典中的某些键开始,并且我有一个循环,它会遍历到字典中还有键为止。总体算法如下:

从字典中的某些键开始
当字典中仍然有键时
对字典中的第一个键执行一些操作
删除第一个键

请注意,在上述循环中的 "一些操作" 可能会向字典中添加新的键。
我尝试过 `for key,value in d.iteritems()`,但是当循环进行时,会添加一些新的键,导致这种方法失败。

15
if dict 应该检查是否为空。 - squiguy
你真正想做什么?算法是什么,字典里有什么? - Karl Knechtel
一个普通的字典只是一个哈希表,没有任何顺序概念,“第一个”是毫无意义的。如果您需要这种行为,可以使用OrderedDict - Ed Randall
7个回答

48

any(d)

如果字典d中至少包含一个类似于True的键则返回True,否则返回False。

示例:

any({0:'test'}) == False

另一种(更一般化的)方式是检查项目数:

len(d)


2
这是根据http://docs.python.org/2/library/functions.html#any的正确解决方案。 - starryknight64
53
这不对。如果d至少包含一个类似于True的键,则any(d)返回True。但是,如果键类似于False -- 例如,d = {0: 'this dictionary is not empty'} -- 那么any(d)将会是False。 - DSM
1
感谢 @DSM 根据 falselike/truelike 键的备注进行了修改。 - Wajih

19

只需查阅词典:

d = {'hello':'world'}
if d:
  print 'not empty'
else:
  print 'empty'

d = {}
if d:
  print 'not empty'
else:
  print 'empty'

18

我只是想知道我将要尝试提取数据的字典是否已经有数据了,这似乎是最简单的方法。

d = {}

bool(d)

#should return
False

d = {'hello':'world'}

bool(d)

#should return
True

15
这将解决它:
while d:
    k, v = d.popitem()
    # now use k and v ...

在布尔上下文中,如果字典为空,则为False,否则为True。

字典中没有“第一个”项目,因为字典不是有序的。但是,每次popitem将删除并返回一些项目。


那么在 while 循环中,我应该如何获取第一个键? - username_4567
实际上主要问题是当您在内部操作中添加键时,解释器会抛出一个错误:迭代过程中字典大小发生了变化。 - username_4567
1
那是一个不同的问题。不要修改你正在迭代的对象。你需要的是一个队列。 - kreativitea
我已经扩展了我的答案。正如@kreativitea所说,您无法修改正在迭代的对象,并且在某些算法中队列是正确的答案,但是当顺序不重要时,字典可以是一个很好的选择。 - Jamey Sharp
@JameySharp。嘿,我不是有意伤害你。如果我偶然伤害了你,我很抱歉。 - Rohit Jain
@RohitJain 道歉已经接受,没关系。 :-) - Jamey Sharp

9

我认为这种方式更符合Pythonic并且适用于单行:

如果你只需要使用你的函数检查值:

if filter( your_function, dictionary.values() ): ...

当你需要知道你的字典是否包含任何键时:

if dictionary: ...

无论如何,在这里使用循环都不符合Python的风格。


2
据我所知,for循环使用iter函数,当您在迭代结构时,不应该对其进行更改。它必须是一个字典吗?如果您使用列表,类似这样的内容可能会起作用:
while len(my_list) > 0:
    #get last item from list
    key, value = my_list.pop()
    #do something with key and value
    #maybe
    my_list.append((key, value))

请注意,my_list是(key, value)元组的列表。唯一的缺点是无法通过键访问。
编辑:算了,上面的答案大多相同。

2

这里还有另一种方法:

isempty = (dict1 and True) or False

如果dict1是空的,则dict1和True的结果为{},当与False解析时得到False。

如果dict1非空,则dict1和True的结果为True,当与False解析时得到True。


9
去繁就简,可以尝试使用bool(dict1)替换原文。 - Platinum Azure

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接