将值与键值匹配并获取键

Match a value to key value and get key

假设我需要这样做: 我需要将列表 'check_keys' 中的值与字典 'parm' 中的键值进行匹配,并将匹配的键以相同的顺序存储到新列表 'insert'

parm = {'f': 'w', 'l': 'b', 'b': 'y', 'u': 'o', 't': 'r', 'r': 'g'}
check_keys = ['r','b','o','g','w','y']
insert = ['t','l','u','r','f','b']

也许是这样的?

insert = []
for k, v in parm.items():
    if k in check_keys:
        insert.append(k)

或者这个更短的版本:

insert = [k for k, v in parm.items() if k in check_keys]

花了一些时间,但我想我明白你想做什么了。

如果我是对的,你不想从值到键反向查找字典。 最简单的方法是创建反向字典。

rparm = dict( (value,key) for key,value in parm.items())

然后匹配数据,例如

insert = [rparm[key] for key in check_keys]

很抱歉使用了所有这些列表和生成器理解。如果我们不熟悉它们,我可以添加经典的 for 循环版本。

一种可能的方法是反转字典,平均而言,这可以在线性时间(相对于您的parm dict 的大小)内完成。

一旦字典被颠倒,你搜索到的值就变成了键 现在可以轻松访问 check_keys 列表中每个键的 O(1)。

rev_parm = dict((v, k) for k, v in parm.items())
insert = [rev_parm[k] for k in check_keys]

这不是哈希的一个很好的用途Table/Dictionary。给定字典的 keys,哈希 Table 可让您快速访问 values。在这里,您正在尝试访问字典的键,给定值(即相反)。

这很糟糕,因为:

  • 速度很慢。您需要遍历整个字典才能找到您的值。
  • 结果是不确定的,因为字典是无序的。如果您输入的是 parm = {'a': 'r', 'b': 'r'}check_keys = [r],则不确定您会得到 [a] 还是 [b]

综上所述,这应该可以解决您的问题:

parm = {'f': 'w', 'l': 'b', 'b': 'y', 'u': 'o', 't': 'r', 'r': 'g'}
check_keys = ['r','b','o','g','w','y']
insert = ['t','l','u','r','f','b']

insert = []
for v in check_keys:
    for k in parm:
        if parm[k] == v:
            insert.append(k)

print insert

当然,假设这是一个更大程序的一部分,我建议您不要使用上述方法,而是重新评估您的整个方法。

你可以使用列表理解来解决这个问题

insert = [k for i in check_keys for k in parm if parm[k] == i]
# ['t', 'l', 'u', 'r', 'f', 'b']