【问题标题】:Return keys of dictionary if values match with a given list如果值与给定列表匹配,则返回字典的键
【发布时间】:2021-02-12 11:44:55
【问题描述】:

如果字典中的值与列表的元素匹配,我想返回给定字典的所有键。假设我有以下字典:

my_dict = {'flower1': ['blue'], 
           'flower2': ['red', 'green', 'blue'],
           'flower3': ['yellow'],
           'flower4': ['blue', 'black', 'cyan']}

现在我想将字典中的值与列表中的以下元素进行匹配:

my_lst = ['black',
          'red',
          'blue',
          'yellow',
          'green',
          'purple',
          'brown',
          'cyan']

我的目标是获得如下字典:

result_dict = {'black': ['flower4'], 
               'red': ['flower2'],
               'blue': ['flower1', 'flower2', 'flower4'],
               'yellow': ['flower3']
               'green': ['flower2'], 
               'purple': [],
               'brown': [],
               'cyan': []}

现在我尝试了一个简单的列表推导,它工作正常,但只返回一个简单的无序列表,如:

In[14]: [key for key, value in my_dict.items() for i in range(0, len(my_lst)) if my_lst[i] in value]

Out[14]:['flower1',
         'flower2',
         'flower2',
         'flower2',
         'flower3',
         'flower4',
         'flower4',
         'flower4']

执行此类操作的最佳方法是什么?我无法理解它,任何帮助将不胜感激。

【问题讨论】:

    标签: python dictionary key-value


    【解决方案1】:

    不要过度复杂化。分两个完全独立的步骤:

    1. my_lst 转换为合适的result 字典。
    2. 遍历花朵/颜色数据,并将它们添加到result 字典中。

    例如:

    # create result dict, adding each color as a key
    # make the value of each key an empty list initially
    result = {k: [] for k in my_lst}
    
    # iterate through the items of the flower/color dict
    for flower, colors in my_dict.items():
    
        # append the flower corresponding to each color
        # to the appropriate list in the result dict
        for color in colors:
            result[color].append(flower)
    
    print(result)
    

    输出:

    {'black': ['flower4'], 'red': ['flower2'], 'blue': ['flower1', 'flower2', 'flower4'], 'yellow': ['flower3'], 'green': ['flower2'], 'purple': [], 'brown': [], 'cyan': ['flower4']}
    

    当然,这是假设my_dict 中的每种颜色都出现在my_lst 中。

    【讨论】:

      【解决方案2】:

      这可以使用两个 for 循环来实现。它比使用单线更具可读性。我提供了一个代码 sn-p,它完全符合您的要求,理解它的工作原理相当直观。您获取每个列表元素并检查每个键是否可以在值列表中找到该元素。

      result_dict = {}
      for ele in my_lst:
          result_dict[ele] = []
          for key in my_dict.keys():
              if ele in my_dict[key]:
                  result_dict[ele].append(key)
      

      【讨论】:

        【解决方案3】:

        这个函数可以用来代替你的'result_dict':

        def flowers_by_color(color, data = my_dict):
            return [flower for flower in data.keys() if color in data[flower]]
        
        result_dict = {color:flowers_by_color(color) for color in my_lst}
        

        【讨论】:

          【解决方案4】:

          你可以这样做:

          result_dict = {color: [] for color in my_lst}
          
          
          for flower in my_dict:
            for color in my_dict[flower]:
              if color in my_lst:
                result_dict[color].append(flower)
          
          

          【讨论】:

          • 我认为my_list 包含所有颜色,我可以编辑我的帖子。
          猜你喜欢
          • 2017-03-22
          • 2019-10-26
          • 2022-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-01
          • 1970-01-01
          • 2021-12-24
          相关资源
          最近更新 更多