Найти - Пользователи
Полная версия: Поиск похожих имен
Начало » Python для новичков » Поиск похожих имен
1 2
MR_Magnus
Здравствуйте, помогите пожалуйста решить такую задачку: у меня есть большой список имен из которого мне нужно составить списки, имена которых имеют одинаковую часть. Например:
 list = ['name', 'name_white', 'name_black', 'name_blue', 'name_print', 'name_print_yellow', 'name_print_white', 'name_print_black', 'name_hide01', 'name_hide01_098', 'name_hide01_347', 'name_hide01_009']
На выходе нужно получить:
 ['name', 'name_white', 'name_black', 'name_blue']
 ['name_print', 'name_print_yellow', 'name_print_white', 'name_print_black']
 ['name_hide01', 'name_hide01_098', 'name_hide01_347', 'name_hide01_009']
Я пытаюсь посимвольно сравнивать каждое имя с содержимым списка, каждый раз находя общую часть (например в именах ‘name_print_yellow’ и ‘name_print_white’ это ‘name_print_’) и использовать её для фильтрации и составления отдельного списка, но выходит не очень.
marvellik
 lst = ['name', 'name_white', 'name_black', 'name_blue', 'name_print', 'name_print_yellow', 'name_print_white', 'name_print_black', 'name_hide01',
         'name_hide01_098', 'name_hide01_347', 'name_hide01_009']
 
analogue = lst.pop(0)
result = [i for i in lst if analogue in i]
print(result)
 ['name_white', 'name_black', 'name_blue', 'name_print', 'name_print_yellow', 'name_print_white', 'name_print_black', 'name_hide01', 'name_hide01_098', 'name_hide01_347', 'name_hide01_009']
MR_Magnus
marvellik
Спасибо за столь быстрый ответ. Кажется у вас в принте потеряно имя ‘name’ и в результате получается такой же список как и в начале. Смысл в том, чтобы получить отдельные списки как в примере выше, или список со списками:
input:
 list = ['name', 'name_print_black', 'name_black', 'name_hide01', 'name_print', 'name_hide01_009', 'name_print_white', 'name_white', 'name_blue', 'name_hide01_098', 'name_hide01_347', 'name_print_yellow']
output:
 list1 = ['name', 'name_white', 'name_black', 'name_blue']
 list2 = ['name_print', 'name_print_yellow', 'name_print_white', 'name_print_black']
 list3 = ['name_hide01', 'name_hide01_098', 'name_hide01_347', 'name_hide01_009']
или
 list_new = [['name', 'name_white', 'name_black', 'name_blue'], ['name_print', 'name_print_yellow', 'name_print_white', 'name_print_black'], ['name_hide01', 'name_hide01_098', 'name_hide01_347', 'name_hide01_009']]
marvellik
не понятен критерий совпадений ведь name совпадает с
 ['name', 'name_white', 'name_black', 'name_blue', 'name_print', 'name_print_yellow', 'name_print_white', 'name_print_black', 'name_hide01', 'name_hide01_098', 'name_hide01_347', 'name_hide01_009']
а у вас только результат
 ['name', 'name_white', 'name_black', 'name_blue']
далее ‘name_print’ совпадения как у вас
 ['name_print', 'name_print_yellow', 'name_print_white', 'name_print_black']
py.user.next
Надо делать split() по подчёркивания для слова, с которым сравниваешь остальные слова в списке.
Если split() не сделаешь, то “name_pri” тоже будет образовывать группу найденых.
MR_Magnus
py.user.next
Надо делать split() по подчёркивания для слова, с которым сравниваешь остальные слова в списке.Если split() не сделаешь, то “name_pri” тоже будет образовывать группу найденых.
Многие имена не имеют подчеркивания и при этом имеют общий корень. И расположены они беспорядочно. Мне кажется, единственный выход это посимвольное сравнение всех имён друг с другом для определения паттерна и использование его для составления отдельных списков.
 path = "A:\images"
dirlist = os.listdir(path)
imlist = [i for i in dirlist]
    part_name = {}
    for im in imlist:
        if len(name1)>len(im):
            a = im
        else:
            a = name1
            part_name_tmp = ""
            for n in range(len(a)):
                if name1[n] == im[n]:
                    part_name_tmp = part_name_tmp + name1[n]
                else:
                    if part_name_tmp in part_name:
                        part_name[part_name_tmp] = part_name[part_name_tmp] + 1
                    else:
                        part_name[part_name_tmp] = 1
part = [part for part in part_name if part in name1]
partt = max(part, key=len)
if partt[-1:] == "_":
    partt = partt[:-1]
print "pattern :", partt
Это подобие кода находит паттерн сравнивая заданную ранее name1 с файлами по пути path. Подогнать под текущую ситуацию не получилось.
PEHDOM
MR_Magnus
и составления отдельного списка, но выходит не очень.
потому и выходит что нету четкого алгоритма, например мне непонятно почему, name_print или name_hide01 не попал в выборку“ ‘name’, ‘name_white’, ‘name_black’, ‘name_blue’”.
Напиши сначала на листике пошагово по каким критериям ты их сортируеш, типа берем это сравниваем с тем, если равно это в этот список, иначе в другой..
py.user.next
MR_Magnus
Многие имена не имеют подчеркивания и при этом имеют общий корень.
Для программы нет понятия корень, она работает с символами строки. То, что ты пытаешься сделать, приведёт к тому, что будут группы вида
['n', 'name1', 'name2', 'name3']
['na', 'name1', 'name2', 'name3']
['nam', 'name1', 'name2', 'name3']
['name', 'name1', 'name2', 'name3']
Поэтому ты должен либо по почёркиваниям делить и потом сравнивать получившиеся кортежи, либо ввести другой метод деления - “по корню”, который ты точно также должен сначала применять, чтобы получить кортеж частей строки. А дальше ты так же сравниваешь кортежи, как и в случае деления по подчёркиванию.

Тут не прокатит просто сравнивать строки.
Vladimirv
Капец какой балаган развели из-за простенькой задачки

 lst = ['name', 'name_print_black', 'name_black', 'name_hide01', 
    'name_print', 'name_hide01_009', 'name_print_white', 'name_white', 
    'name_blue', 'name_hide01_098', 'name_hide01_347', 'name_print_yellow']
list1, list2, list3, xz = [], [], [], []
for item in lst:
    if item.startswith('name_print'):
        list2.append(item)
    elif item.startswith('name_hide'):
        list3.append(item)
    elif item.startswith('name'):
        list1.append(item)
    else:
        xz.append(item)
list_new=[list1, list2, list3]
PEHDOM
Vladimirv серьезно?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB