一个衬垫,用于确定字典值是否都是空列表

时间:2011-05-04 20:42:32

标签: python

我有一个字典如下:

someDict = {'a':[], 'b':[]}

我想确定这个字典是否有任何非空列表的值。如果是这样,我想返回True。如果没有,我想返回False。有什么方法可以把它作为一个班轮?

6 个答案:

答案 0 :(得分:13)

根据我的测试,以下单行(我的原始答案)在所有情况下都具有最佳时间性能。有关测试信息,请参阅下面的编辑我确实承认使用生成器表达式的解决方案将具有更高的内存效率,并且应该是大型dicts的首选。

编辑:这是一个老化的答案,我的测试结果可能对最新版本的python无效。由于生成器表达式是更“pythonic”的方式,我想他们的性能正在提高。如果您在“热门”代码路径中运行它,请自行测试。

bool([a for a in my_dict.values() if a != []])

编辑:

决定玩得开心。答案的比较,而不是任何特定的顺序:

(如下所示,timeit将根据运行时间小于0.2秒来计算循环数量级)

bool([a for a_dict.values()如果是!= []]):

python -mtimeit -s"my_dict={'a':[],'b':[]}" "bool([a for a in my_dict.values() if a != []])"
1000000 loops, best of 3: 0.875 usec per loop

任何(my_dict中的[my_dict [i]!= []]):

python -mtimeit -s"my_dict={'a':[],'b':[]}" "any([my_dict[i] != [] for i in my_dict])"
1000000 loops, best of 3: 0.821 usec per loop

my_dict.itervalues()中的x的任何(x!= []):

python -mtimeit -s"my_dict={'a':[],'b':[]}" "any(x != [] for x in my_dict.itervalues())"
1000000 loops, best of 3: 1.03 usec per loop

all(map(lambda x:x == [],my_dict.values())):

python -mtimeit -s"my_dict={'a':[],'b':[]}" "all(map(lambda x: x == [], my_dict.values()))"
1000000 loops, best of 3: 1.47 usec per loop

filter(lambda x:x!= [],my_dict.values()):

python -mtimeit -s"my_dict={'a':[],'b':[]}" "filter(lambda x: x != [], my_dict.values())"
1000000 loops, best of 3: 1.19 usec per loop



再次编辑 - 更有趣:

any()是最好的情况O(1)(如果bool(list [0])返回True)。 any()的最坏情况是“正面”场景 - bool(list [i])返回False的长值列表。


看看当dict变大时会发生什么:

bool([a for a_dict.values()如果是!= []]):

#n=1000
python -mtimeit -s"my_dict=dict(zip(range(1000),[[]]*1000))" "bool([a for a in my_dict.values() if a != []])"
10000 loops, best of 3: 126 usec per loop

#n=100000
python -mtimeit -s"my_dict=dict(zip(range(100000),[[]]*100000))" "bool([a for a in my_dict.values() if a != []])"
100 loops, best of 3: 14.2 msec per loop

任何(my_dict中的[my_dict [i]!= []]):

#n=1000
python -mtimeit -s"my_dict=dict(zip(range(1000),[[]]*1000))" "any([my_dict[i] != [] for i in my_dict])"
10000 loops, best of 3: 198 usec per loop

#n=100000
python -mtimeit -s"my_dict=dict(zip(range(100000),[[]]*100000))" "any([my_dict[i] != [] for i in my_dict])"
10 loops, best of 3: 21.1 msec per loop



但这还不够 - 最糟糕的'False'场景怎么样?

bool([a for a_dict.values()如果是!= []]):

python -mtimeit -s"my_dict=dict(zip(range(1000),[0]*1000))" "bool([a for a in my_dict.values() if a != []])"
10000 loops, best of 3: 198 usec per loop

任何(my_dict中的[my_dict [i]!= []]):

python -mtimeit -s"my_dict=dict(zip(range(1000),[0]*1000))" "any([my_dict[i] != [] for i in my_dict])"
1000 loops, best of 3: 265 usec per loop

答案 1 :(得分:8)

不是假名或不是空名单:

不虚假:

any(someDict.values())

非空列表:

any(a != [] for a in someDict.values())

any(map(lambda x: x != [], someDict.values()))

或者如果您对可靠的返回值感到满意:

filter(lambda x: x != [], someDict.values())

返回非空列表的项列表,因此如果它们都是空列表,则为空列表:)

答案 2 :(得分:6)

非常字面意思:

any(x != [] for x in someDict.itervalues())

答案 3 :(得分:4)

试试这个

 all([d[i] == [] for i in d])

编辑:哎呀,我想我让你倒退了。让deMorgan

any([d[i] != [] for i in d])

第二种方式无论如何都具有短路优势

答案 4 :(得分:3)

len(filter(lambda x: x!=[], someDict.values())) != 0

答案 5 :(得分:2)

>>> someDict = {'a':[], 'b':[]} 
>>> all(map(lambda x: x == [], someDict.values()))
True