Форум сайта python.su
0
Здравствуйте, помогите пожалуйста решить такую задачку: у меня есть большой список имен из которого мне нужно составить списки, имена которых имеют одинаковую часть. Например:
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']
Отредактировано MR_Magnus (Авг. 5, 2018 19:59:49)
Офлайн
73
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']
Офлайн
0
marvellikСпасибо за столь быстрый ответ. Кажется у вас в принте потеряно имя ‘name’ и в результате получается такой же список как и в начале. Смысл в том, чтобы получить отдельные списки как в примере выше, или список со списками:
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']
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)
Офлайн
73
не понятен критерий совпадений ведь 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_yellow', 'name_print_white', 'name_print_black']
Офлайн
857
Надо делать split() по подчёркивания для слова, с которым сравниваешь остальные слова в списке.
Если split() не сделаешь, то “name_pri” тоже будет образовывать группу найденых.
Офлайн
0
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
Отредактировано MR_Magnus (Авг. 6, 2018 09:24:39)
Офлайн
294
MR_Magnusпотому и выходит что нету четкого алгоритма, например мне непонятно почему, name_print или name_hide01 не попал в выборку“ ‘name’, ‘name_white’, ‘name_black’, ‘name_blue’”.
и составления отдельного списка, но выходит не очень.
[code python][/code]
Отредактировано PEHDOM (Авг. 7, 2018 15:17:35)
Офлайн
857
MR_MagnusДля программы нет понятия корень, она работает с символами строки. То, что ты пытаешься сделать, приведёт к тому, что будут группы вида
Многие имена не имеют подчеркивания и при этом имеют общий корень.
['n', 'name1', 'name2', 'name3']
['na', 'name1', 'name2', 'name3']
['nam', 'name1', 'name2', 'name3']
['name', 'name1', 'name2', 'name3']
Офлайн
7
Капец какой балаган развели из-за простенькой задачки
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)
Офлайн
294
Vladimirv серьезно?
[code python][/code]
Офлайн