упорядочивание значений словаря в списке на основе позиции в ключах

#python

#python

Вопрос:

У меня есть словарь, где значение представляет собой список из нескольких подстрок из ключа, который является строкой. Например:

 d = {"How are things going": ["going","How"], "What the hell" : ["What", "hell"], "The police dept": ["dept","police"]}
  

и я хочу получить список списков, сгенерированных из значений списка на основе позиции, в которой они появились в ключе. Например, в приведенном выше случае:

 output = [["How", "going"], ["What", "hell"], ["police", "dept"]]
  

Я не нашел эффективного способа сделать это, поэтому я использовал хакерский подход:

 final_output = []
for key,value in d.items():
    if len(value) > 1:
       new_list = []
       for item in value:
          new_list.append(item, key.find(item)) 
       
          new_list.sort(key = lambda x: x[1]) 
       ordered_list = [i[0] for i in new_list] 
       final_ouput.append(ordered_list)
     
  

Ответ №1:

Используйте sorted с str.find :

 [sorted(v, key=k.find) for k, v in d.items()]
  

Вывод:

 [['How', 'going'],
 ['What', 'hell'], 
 ['police', 'dept']]
  

Ответ №2:

Использование понимания списка

 output = [[each_word for each_word in key.split() if each_word in value] for key, value in d.items()]
  

Ответ №3:

Ключи уже отсортированы, поэтому мы можем пропустить сортировку

мы можем разделить ключ на " " и отфильтровать разделенное по соответствующему значению в dict

 d = {"How are things going": ["going","How"], "What the hell" : ["What", "hell"], "The police dept": ["dept","police"]}

lists = []
for k in d.keys():
    to_replace = k.split(" ")
    replaced = filter(lambda x: x in d[k],to_replace)
    lists.append(list(replaced))

print(lists)
  

Вывод:

 [['How', 'going'], ['What', 'hell'], ['police', 'dept']]