Return 如果值与给定列表匹配,则为字典的键

Return keys of dictionary if values match with a given list

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

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': []}

现在我尝试了一个简单的列表理解,效果很好,但是 return 只是一个简单的无序列表,例如:

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

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

你可以这样做:

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)

不要把它复杂化。分两个完全独立的步骤进行:

  1. my_lst转换成合适的result字典。
  2. 遍历 flower/color 数据,并将它们添加到 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 中。

这可以使用两个 for 循环来实现。它比使用单行代码更具可读性。我提供了一个代码片段,它可以完全满足您的需求,并且非常直观地理解它是如何工作的。您获取每个列表元素并检查每个键是否可以在值列表中找到该元素。

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)

这个函数可以用来替代你的'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}