Список строк, которые я хочу сгруппировать, если они содержат определенную подстроку из основного списка
У меня есть список строк, которые я хочу сгруппировать, если они содержат определенную подстроку из основного списка.
Пример ввода:
["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']]