【发布时间】:2010-12-16 19:17:56
【问题描述】:
如何确定任何列表元素是否是 dict 的键? 直接的方法是,
for i in myList:
if i in myDict:
return True
return False
但是有更快/更简洁的方法吗?
【问题讨论】:
-
@Dario:可能是嘘声,但我想答案还是一样的。
标签: python list dictionary
如何确定任何列表元素是否是 dict 的键? 直接的方法是,
for i in myList:
if i in myDict:
return True
return False
但是有更快/更简洁的方法吗?
【问题讨论】:
标签: python list dictionary
除了any(item in my_dict for item in my_list) 来自@Ronny's answer:
any(map(my_dict.__contains__, my_list)) # Python 3.x
或者:
from itertools import imap
any(imap(my_dict.__contains__, my_list)) # Python 2.x
需要考虑的案例:
比较函数(参见main.py):
def mgag_loop(myDict, myList):
for i in myList:
if i in myDict:
return True
return False
def ronny_any(myDict, myList):
return any(x in myDict for x in myList)
def ronny_set(myDict, myList):
return set(myDict) & set(myList)
def pablo_len(myDict, myList):
return len([x for x in myList if x in myDict]) > 0
def jfs_map(my_dict, my_list):
return any(map(my_dict.__contains__, my_list))
def jfs_imap(my_dict, my_list):
return any(imap(my_dict.__contains__, my_list))
结果:mgag_loop() 在所有情况下都是最快的。
def args_key_at_start(n):
'Make args for comparison functions "key at start" case.'
d, lst = args_no_key(n)
lst.insert(0, n//2)
assert (n//2) in d and lst[0] == (n//2)
return (d, lst)
def args_key_at_end(n):
'Make args for comparison functions "key at end" case.'
d, lst = args_no_key(n)
lst.append(n//2)
assert (n//2) in d and lst[-1] == (n//2)
return (d, lst)
def args_no_key(n):
'Make args for comparison functions "no key" case.'
d = dict.fromkeys(xrange(n))
lst = range(n, 2*n+1)
assert not any(x in d for x in lst)
return (d, lst)
下载main.py、make-figures.py,运行python main.py(应安装numpy、matplotlib 以创建绘图)。
要更改输入列表的最大大小,要绘制的点数相应地提供--maxn、--npoints。示例:
$ python main.py --maxn 65536 --npoints 16
【讨论】:
any 的主要优势是短路,any(map(... 失去了这个主要优势!
#!python
any(x in MyDict for x in MyList)
set(MyList).intersection(MyDict)
【讨论】:
MyDict' is not at the beginning of MyList`stackoverflow.com/questions/1737778/dict-has-key-from-list/…,'set' 版本比'any' 版本快
This was a popular answer 到一个相关问题:
>>> if all (k in foo for k in ("foo","bar")):
... print "They're there!"
...
They're there!
您可以调整它以检查字典中是否出现任何内容:
>>> if any(k in myDict for k in ("foo","bar")):
... print "Found one!"
...
Found one!
您可以检查键列表:
>>> if any(k in myDict for k in myList):
... print "Found one!"
...
Found one!
【讨论】:
非常感谢大家。我测试了所有答案的性能,最快的是
return len([x for x in myList if x in myDict]) > 0
但我没有尝试“设置”答案,因为我没有看到如何将它变成一行。
【讨论】:
len() 怎么能更快。你用了什么输入法?我已经测量了所有答案的性能:stackoverflow.com/questions/1737778/dict-has-key-from-list/…
假设您在谈论 python,另一种方法是:
return len([x for x in myList if x in myDict]) > 0
【讨论】: