字典中是否存在列表中的键
我怎么才能判断列表中的元素是否是字典的键呢?最简单的方法是:
for i in myList:
if i in myDict:
return True
return False
但是有没有更快或者更简洁的方法呢?
5 个回答
6
除了@Ronny的回答中提到的any(item in my_dict for item in my_list)
,我们还有其他的方法:
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()
在所有情况下都是最快的。
1. 列表开头的元素在字典中。
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)
2. 列表结尾的元素在字典中。
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)
3. 列表中的元素都不在字典中。
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
20
在编程中,有时候我们需要处理一些数据,比如从一个地方获取信息,然后在另一个地方使用这些信息。这个过程就像是把水从一个水桶倒到另一个水桶里。
有些时候,我们会遇到一些问题,比如数据的格式不对,或者我们想要的数据没有被正确地获取到。这就像是你想要从水桶里倒水,但水桶的口太小,水倒不出来。
为了避免这些问题,我们可以使用一些工具和方法来确保数据能够顺利地传递和使用。比如,我们可以检查数据的格式,确保它是我们需要的样子,或者使用一些函数来处理数据,使其变得更容易使用。
总之,处理数据就像是一个搬运工的工作,我们需要确保每一步都做得正确,这样才能顺利地完成任务。
#!python
any(x in MyDict for x in MyList)
set(MyList).intersection(MyDict)
2
假设你是在说Python,另一种实现这个功能的方法是:
return len([x for x in myList if x in myDict]) > 0