Сопоставление элементов из одного списка в другой, пропуск уже сопоставленных элементов, Python

#python #list #text-processing

#python #Список #обработка текста

Вопрос:

Решение этой проблемы, вероятно, очевидно для многих из вас, но я застрял, поэтому решил спросить.

У меня есть два списка в следующем формате:

 target_list =['apples 1', 'oranges 1', 'bananas 2', 'apples 3', 'oranges 2','mango 3', 'apples 2']
source_list =  ['A apples', 'B mango', 'C apples', 'D bananas', 'E oranges','F apples', 'G oranges']
  

Мне нужно перебирать каждый из target_items in target_list и, если target_item()[0] он совпадает с source_item()[1] in source_list , return target_item()[0],source_item()[0], target_item()[1] . Важно, чтобы в выходных данных не было повторений пар source_item / target_item,

Вот что я имею в виду. Предположим, я использую обычный старый цикл for:

 for target_item in target_list:
        for source_item in source_list: 
                if source_item.split()[1] == target_item.split()[0]: 
                        print target_item.split()[0], source_item.split()[0],  target_item.split()[1]
  

(Неправильный) вывод, который я получаю,:

 apples A 1
apples C 1
apples F 1
oranges E 1
oranges G 1
bananas D 2
apples A 3
apples C 3
apples F 3
oranges E 2
oranges G 2
mango B 3
apples A 2
apples C 2
apples F 2
  

Обратите внимание, что пары источник / цель apple A, яблоки C, яблоки F повторяются 3 раза каждый раз с разными номерами. То же самое относится и к парам oranges . Вместо этого мне нужно

 apples A 1
apples C 2
apples F 3
oranges E 1
oranges G 2
bananas D 2
mango B 3
  

Т.е. Каждая запись всегда должна иметь разные источник и цель.

Кроме того, для каждого набора пар ‘apple $ LETTER’ и ‘orange $ LETTER’ не имеет значения, переставлены ли теги чисел по-разному. Итак, следующий результат одинаково хорош:

 apples A 2
apples C 1
apples F 3
oranges E 2
oranges G 1
bananas D 2
mango B 3
  

Ответ №1:

 target_list =['apples 1', 'oranges 1', 'bananas 2', 'apples 3', 'oranges 2','mango 3', 'apples 2']
source_list =  ['A apples', 'B mango', 'C apples', 'D bananas', 'E oranges','F apples', 'G oranges']

from collections import defaultdict

# you want each target fruit to be a group, so use them as keys in a dict
# use a defaultdict list so whenever you access a key that doesn't exist
# it creates an empty list at that key
td = defaultdict(list)

for item in target_list:
    key, value = item.split()
    # the value for each fruit is a list of the numbers associated with it
    td[key].append(value)

# for each source item find a match and pop a number from the list
# so that each pair gets a different number
for item in source_list:
    letter, key = item.split()
    if key in td:
        print key, letter, td[key].pop()