【问题标题】:Match a value to key value and get key将值与键值匹配并获取键
【发布时间】:2018-10-07 19:05:13
【问题描述】:

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

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']

【问题讨论】:

  • 这些列表插入背后的一般逻辑是什么?如果没有,您不妨输入最终结果。
  • 不,检查的元素将来自 parm 的键值(这已经过验证)。我希望在列表元素集之前与正确的键相关联,稍后我计划将它们转换为字典
  • 背后的一般逻辑是parm键值对也可以不同。
  • 我完全不明白您是如何得出最终结果的。那可能是我的错,或者您的解释需要工作-或两者兼而有之。 :)
  • 我已经更新了问题

标签: python list dictionary key-value


【解决方案1】:

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

一旦字典被反转,您搜索的值就会变成键 现在可以轻松访问 check_keys 列表中每个键的 O(1)。

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

【讨论】:

  • 请花时间向 OP 和将来可能遇到的人解释您的答案。
  • 感谢@hcoat 的评论。在答案中编辑
【解决方案2】:

花了一些时间,但我想我知道你想做什么了。

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

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

然后匹配数据,例如

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

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

【讨论】:

  • 谢谢!我明白这很好。
【解决方案3】:

也许是这样的?

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]

【讨论】:

  • 这给出了一个输出:['b','r'] 预期输出:['t','l','u','r','f','b']
【解决方案4】:

这不是哈希表/字典的好用处。给定字典的,哈希表可让您快速访问。在这里,您正在尝试访问字典的键,给定值(即相反)。

这很糟糕,因为:

  • 速度很慢。您需要遍历整个字典才能找到您的值。
  • 结果是不确定的,因为字典是无序的。如果您的输入是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

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多