Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 5, 2018 19:58:46

MR_Magnus
Зарегистрирован: 2018-08-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск похожих имен

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

 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_’) и использовать её для фильтрации и составления отдельного списка, но выходит не очень.

Отредактировано MR_Magnus (Авг. 5, 2018 19:59:49)

Офлайн

#2 Авг. 5, 2018 20:34:28

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Поиск похожих имен

 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']

Офлайн

#3 Авг. 5, 2018 21:45:51

MR_Magnus
Зарегистрирован: 2018-08-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск похожих имен

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']]

Отредактировано MR_Magnus (Авг. 5, 2018 21:50:37)

Офлайн

#4 Авг. 5, 2018 22:41:01

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Поиск похожих имен

не понятен критерий совпадений ведь 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']

Офлайн

#5 Авг. 6, 2018 00:34:52

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Поиск похожих имен

Надо делать split() по подчёркивания для слова, с которым сравниваешь остальные слова в списке.
Если split() не сделаешь, то “name_pri” тоже будет образовывать группу найденых.



Офлайн

#6 Авг. 6, 2018 09:20:04

MR_Magnus
Зарегистрирован: 2018-08-05
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск похожих имен

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. Подогнать под текущую ситуацию не получилось.

Отредактировано MR_Magnus (Авг. 6, 2018 09:24:39)

Офлайн

#7 Авг. 7, 2018 15:11:15

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Поиск похожих имен

MR_Magnus
и составления отдельного списка, но выходит не очень.
потому и выходит что нету четкого алгоритма, например мне непонятно почему, name_print или name_hide01 не попал в выборку“ ‘name’, ‘name_white’, ‘name_black’, ‘name_blue’”.
Напиши сначала на листике пошагово по каким критериям ты их сортируеш, типа берем это сравниваем с тем, если равно это в этот список, иначе в другой..



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Авг. 7, 2018 15:17:35)

Офлайн

#8 Авг. 8, 2018 01:06:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Поиск похожих имен

MR_Magnus
Многие имена не имеют подчеркивания и при этом имеют общий корень.
Для программы нет понятия корень, она работает с символами строки. То, что ты пытаешься сделать, приведёт к тому, что будут группы вида
['n', 'name1', 'name2', 'name3']
['na', 'name1', 'name2', 'name3']
['nam', 'name1', 'name2', 'name3']
['name', 'name1', 'name2', 'name3']
Поэтому ты должен либо по почёркиваниям делить и потом сравнивать получившиеся кортежи, либо ввести другой метод деления - “по корню”, который ты точно также должен сначала применять, чтобы получить кортеж частей строки. А дальше ты так же сравниваешь кортежи, как и в случае деления по подчёркиванию.

Тут не прокатит просто сравнивать строки.



Офлайн

#9 Авг. 8, 2018 23:30:36

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

Поиск похожих имен

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

 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]

Отредактировано Vladimirv (Авг. 9, 2018 00:42:49)

Офлайн

#10 Авг. 9, 2018 09:39:08

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Поиск похожих имен

Vladimirv серьезно?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version