一行确定字典值是否都是空列表或n

2024-05-14 10:34:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我的口述如下:

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

我想确定这本词典是否有非空列表的值。如果是的话,我想回到现实。如果没有,我想返回False。有什么办法让这成为一个班轮吗?


Tags: false列表现实办法口述somedict本词典班轮
3条回答

完全按照字面意思:

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

非虚假或非空列表:

不是假的:

any(someDict.values())

非空列表:

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

或者

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

或者如果您可以使用错误的返回值:

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

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

根据我的测试,下面的一行代码(我的原始答案)在所有场景中都具有最佳的时间性能。有关测试信息,请参见下面的编辑。我承认使用生成器表达式的解决方案将更节省内存,对于大型dict应该是首选的。

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

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

编辑:

决定找点乐子。答案的比较,不按特定顺序:

(如下面所用,timeit将根据运行所需的时间少于0.2秒来计算一个数量级的循环)

bool([在我的dict.values中a代表a(),如果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

任何人([我的口述]!=[]对于我来说在我的字典里]:

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

任何(x!=[]对于x,在my_dict.itervalues()中:

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

全部(映射(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

过滤器(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([在我的dict.values中a代表a(),如果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

任何人([我的口述]!=[]对于我来说在我的字典里]:

#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



但这还不够——最坏情况下的“错误”情况如何?

bool([在我的dict.values中a代表a(),如果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

任何人([我的口述]!=[]对于我来说在我的字典里]:

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

相关问题 更多 >

    热门问题