我有一个字典如下:
someDict = {'a':[], 'b':[]}
Run Code Online (Sandbox Code Playgroud)
我想确定这个字典是否有任何非空列表的值.如果是这样,我想返回True.如果没有,我想返回False.有什么办法让这个单线眼镜?
Ben*_*rns 13
根据我的测试,以下单行(我的原始答案)在所有情况下都具有最佳时间性能.有关测试信息,请参阅下面的编辑 我确实承认使用生成器表达式的解决方案将具有更高的内存效率,并且应该是大型dicts的首选.
编辑:这是一个老化的答案,我的测试结果可能无法用于最新版本的python.由于生成器表达式是更"pythonic"的方式,我想他们的性能正在提高.如果您在"热"代码路径中运行它,请进行自己的测试.
bool([a for a in my_dict.values() if a != []])
Run Code Online (Sandbox Code Playgroud)
编辑:
决定玩得开心.答案的比较,不是以任何特定的顺序:
(如下所示,timeit将根据运行时间小于0.2秒计算循环数量级)
bool([a for a_dict.values()如果a!= []]):
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
Run Code Online (Sandbox Code Playgroud)
任何(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
Run Code Online (Sandbox Code Playgroud)
my_dict.itervalues()中的任何(x!= [] for 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
再次编辑 - 更有趣:
any()是最好的情况O(1)(如果bool(list [0])返回True).any()的最坏情况是"正面"场景 - bool(list [i])返回False的一长串值.
看看当dict变大时会发生什么:
bool([a for a_dict.values()如果a!= []]):
#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
Run Code Online (Sandbox Code Playgroud)
任何(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
Run Code Online (Sandbox Code Playgroud)
但这还不够 - 最糟糕的'假'场景怎么样?
bool([a for a_dict.values()如果a!= []]):
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
Run Code Online (Sandbox Code Playgroud)
任何(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
Run Code Online (Sandbox Code Playgroud)
不是假的或不是空的列表:
不是假的:
any(someDict.values())
Run Code Online (Sandbox Code Playgroud)
不是空列表:
any(a != [] for a in someDict.values())
Run Code Online (Sandbox Code Playgroud)
要么
any(map(lambda x: x != [], someDict.values()))
Run Code Online (Sandbox Code Playgroud)
或者,如果你可以使用假的返回值:
filter(lambda x: x != [], someDict.values())
Run Code Online (Sandbox Code Playgroud)
返回非空列表的项列表,因此如果它们都是空列表,则它是一个空列表:)
| 归档时间: |
|
| 查看次数: |
12044 次 |
| 最近记录: |