字典中是否存在列表中的键

7 投票
5 回答
3875 浏览
提问于 2025-04-15 16:02

我怎么才能判断列表中的元素是否是字典的键呢?最简单的方法是:

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

测量相对性能

需要考虑的情况:

  1. 列表开头的元素在字典中。
  2. 列表结尾的元素在字典中。
  3. 列表中的元素都不在字典中。

要比较的函数(见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)

key at start

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)

key at end

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)

no key

如何复现

下载main.pymake-figures.py,然后运行python main.py(需要安装numpymatplotlib来生成图表)。

要改变输入列表的最大大小和绘制的点数,可以分别提供--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

撰写回答