【问题标题】:Get key by value in complex dictionary [closed]在复杂字典中按值获取键[关闭]
【发布时间】:2017-09-19 04:19:38
【问题描述】:

我想知道如何根据字典的键是否包含某个值来返回它。如下图:

dic = {1: [(3,3)], 2: [(1, 2), (2, 3), (1, 3), (4, 3)]}

def get_key(pos):

    for key, value in dic.items():
        if value == pos:
           return key

如您所见,该函数接受一个参数并检查它是否在字典中。如果是这样,它应该返回相应的键。

我一直在搜索与我类似的其他 StackOverflow 问题,但是,解决方案似乎不起作用。

【问题讨论】:

  • 以上代码有什么问题

标签: python loops dictionary


【解决方案1】:

下面的代码可以工作:

def get_key(pos):
    dic = {1: [(3,3)], 2: [(1, 2), (2, 3), (1, 3), (4, 3)]}
    for (key, value) in dic.items():
        if pos in value:
            return key

pos = (1,2)

get_key(pos)

输出:2

值作为列表返回,pos 是单个元组。因此,您应该使用 IN 来检查 pos 是否在作为列表返回的元组集中。

【讨论】:

    【解决方案2】:

    你的意思是在字典中搜索一个元组吗?

    dic = {1: [(3,3)], 2: [(1, 2), (2, 3), (1, 3), (4, 3)]}
    def get_key(pos):
        for key, value in dic.items():
            if pos in value:
               return key
    
    get_key((2,3)) // output 2
    get_key((3,3)) // output 1
    

    【讨论】:

      【解决方案3】:

      您可以传递第二个参数并且它有效。

      dic = {1: [(3,3)], 2: [(1, 2), (2, 3), (1, 3), (4, 3)]}
      
      def get_key(pos, dic):
      
          for key, value in dic.items():
              if value == pos:
                 return key
      
      if __name__ == '__main__':
          print get_key([(3,3)], dic)
      

      下面是输出

      1
      [Finished in 0.0s]
      

      【讨论】:

      • 我支持你。不明白为什么这被否决了
      • 这不是问题,即使这是一种很好的做法。
      【解决方案4】:

      您可以使用 lambda 和单行过滤器解决此问题。希望这对您有所帮助

      dic = {1: [(3,3)], 2: [(1, 2), (2, 3), (1, 3), (4, 3)]}
      
      pos = (2,3)
      
      get_key = filter(lambda x: pos in dic[x], dic)
      print get_key[0]
      

      您可以阅读 lambda 详细信息here

      【讨论】:

      • 值得一提的是,通常“Pythonic”和“lambda/filter”不能很好地结合在一起。
      • @AdamSmith 谢谢...我改变了我的评论
      • get_key = [k for k in dic if pos in dic[x]] 是用 Python 编写的常用方式。虽然我喜欢其他语言的 filter/map/reduce,但 Python 并没有太多使用它们
      猜你喜欢
      • 2017-07-27
      • 2011-12-22
      • 2013-01-02
      • 2011-01-27
      • 1970-01-01
      相关资源
      最近更新 更多