将值与键值匹配并获取键
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']
假设我需要这样做: 我需要将列表 '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']