【问题标题】:How to fetch key from any of assigned values in a multi-value dictionary如何从多值字典中的任何分配值中获取键
【发布时间】:2017-07-18 04:22:46
【问题描述】:

我不确定字典是否适合,但我制作了一个包含 1-7 项列表的字典。我想访问给定列表中任何项目的密钥。这可能吗?我找到了一种在给定一个值 (Get key by value in dictionary) 的情况下访问键的方法,但是如果有多个值怎么办?我的最终目标是在给定一个单独的字符串(字符串 B)的情况下重复一个字符串(字符串 A),该字符串被归类为字符串 A。例如,“类别 A”包含 aa、bb、cc,而“类别 B”包含 a、b , C。 [aa, a, bb, aa, c, b, aa] 的列表将等于:[A, B, A, A, B, B, A]。到目前为止,这是我的尝试,但是它不起作用。

dict = {'A':['aa', 'bb', 'cc'],'B':['a','b','c'] }
nwlst = []
lst = [aa, a, bb, aa, c, b, aa]
for i in lst:
    if i in dict.values():
        nwlst.append([list(dict.keys())[list(dict.values()).index([str(i)])]])

也许使用类似 grep 的东西也可以,但我不知道如何实现这个概念。

【问题讨论】:

    标签: python dictionary indexing


    【解决方案1】:

    我猜您在链接的问题中需要与the accepted answer 非常相似的内容,但您不会测试是否相等,而是测试是否包含在列表中。另外,您忘记为 lst 中的项目使用引号。

    dict = {'A':['aa', 'bb', 'cc'],'B':['a','b','c'] }
    newlst = []
    lst = ['aa', 'a', 'bb', 'aa', 'c', 'b', 'aa']
    for search_v in lst:
        for k, v in dict.items():
            if search_v in v:
                newlst.append(k)
    

    还有其他选项,与链接问题中的其他答案相关。

    例如,您可以像this answer 那样反转字典。 你甚至可以用一个衬垫来做(未经测试)

    dict = {'A':['aa', 'bb', 'cc'],'B':['a','b','c'] }
    new_dict = {iv: k for k, v in dict.items() for iv in v}
    

    然后

    newlst = []
    lst = ['aa', 'a', 'bb', 'aa', 'c', 'b', 'aa']
    for search_k in lst:
        newlst.append(new_dict[search_k])
    

    这也有一个衬里。

    PS:在 Google 中搜索 python 反向字典 会为您提供很多选择。具体见this

    【讨论】:

      【解决方案2】:

      不确定您的最终目标,但字典不会用于这种情况。

      通常,“按值查找”并不是您想要使用字典的方式。如果确实如此,您应该翻转您的键和值,以便最终使用该值作为键。

      dict = {
        'aa': 'A',
        'bb': 'A',
        'cc': 'A',
        'a': 'B',
        'b': 'B',
        'c': 'B',
      }
      

      这样您就可以正确获取它,因此,如果您必须从值到键查找,那么在给定用例的情况下,您更有可能将原始字典转换为此版本的字典进行查找。

      dict = {'A':['aa', 'bb', 'cc'],'B':['a','b','c'] }
      values_to_keys_dict = {}
      for key, values in dict:
        for value in values:
          values_to_keys_dict[value] = key
      
      lst = ['aa', 'a', 'bb', 'aa', 'c', 'b', 'aa']
      for i in lst:
        values_to_keys_dict[i] # To get the "key"
      

      这样,您只需扫描所有值一次,而不是在 lst 中的每个值上扫描所有值。现在,这有一个警告,如果您的“值”集具有相同的值,例如 { 'A': ['a'], 'B': ['a'] },那么这将“丢失”多个键具有相同值的信息。

      【讨论】:

        【解决方案3】:

        考虑Disjoint Set 数据结构。在 [ 'aa', 'bb', 'cc' ] 和 ['a', 'b', 'c'] 使用 Union 方法制成不相交的子集后,Find 方法将返回各自的父对象。

        该结构可以用集合、列表、字典等来实现。Here 是一个相当不错的结构,在网络上很容易找到其他或多/少复杂的实现。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-02
          • 2019-02-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多