Список строк, которые я хочу сгруппировать, если они содержат определенную подстроку из основного списка

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

Пример ввода:

      ["Audi_G71Q3E5T7_Coolant", "Volt_Battery_G9A2B4C6D8E", "Speaker_BMW_G71Q3E5T7", "Engine_Benz_G9A2B4C6D8E", "Ford_G9A2B4C6D8E_Wheel", "Toyota_Exhaust_G71Q3E5T7"]

Основной список:

      ["G71Q3E5T7", "G9A2B4C6D8E"]

Ожидаемый результат:

      [["Audi_G71Q3E5T7_Coolant", "Speaker_BMW_G71Q3E5T7", "Toyota_Exhaust_G71Q3E5T7"], ["Volt_Battery_G9A2B4C6D8E", "Engine_Benz_G9A2B4C6D8E", "Ford_G9A2B4C6D8E_Wheel"]]

Я не нашел ни одного примера или решения в Интернете, но знаю, чтоitertools.groupby()Функция полезна в этих сценариях, но я изо всех сил пытаюсь заставить ее работать.

2 ответа

Пример ввода:

      in_list = ["Audi_G71Q3E5T7_Coolant", "Volt_Battery_G9A2B4C6D8E", "Speaker_BMW_G71Q3E5T7",
           "Engine_Benz_G9A2B4C6D8E", "Ford_G9A2B4C6D8E_Wheel", "Toyota_Exhaust_G71Q3E5T7"]
master_list = ["G71Q3E5T7", "G9A2B4C6D8E"]
out_list = []

Для каждого основного элемента проверьте, находится ли он в каком-либо элементе ввода. Добавить результаты в out_list[index]

      for index, m in enumerate(master_list):
    out_list.append([])
    for i in in_list:
        if m in i:
            out_list[index].append(i)

print(out_list)

itertools.groupbyне подходит, так как вам нужно будет отсортировать данные.

Вы можете использовать регулярное выражение для извлечения идентификаторов и словарь/defaultdict для сбора данных:

      L = ["Audi_G71Q3E5T7_Coolant", "Volt_Battery_G9A2B4C6D8E",
     "Speaker_BMW_G71Q3E5T7", "Engine_Benz_G9A2B4C6D8E",
     "Ford_G9A2B4C6D8E_Wheel", "Toyota_Exhaust_G71Q3E5T7"]
ids = ["G71Q3E5T7", "G9A2B4C6D8E"]

import re
from collections import defaultdict

regex = re.compile('|'.join(map(re.escape, ids)))
# re.compile(r'G71Q3E5T7|G9A2B4C6D8E', re.UNICODE)

out = defaultdict(list)

for item in L:                 # for each item
    m = regex.search(item)     # try to find ID
    if m:                      # if ID
        out[m.group()].append(item)  # add to appropriate list
        
out = list(out.values())

выход:

      [['Audi_G71Q3E5T7_Coolant',
  'Speaker_BMW_G71Q3E5T7',
  'Toyota_Exhaust_G71Q3E5T7'],
 ['Volt_Battery_G9A2B4C6D8E',
  'Engine_Benz_G9A2B4C6D8E',
  'Ford_G9A2B4C6D8E_Wheel']]
Другие вопросы по тегам