Форум сайта python.su
7
PEHDOMВопрос не понял. Вам не понравилось решение?
Vladimirv серьезно?
Офлайн
294
VladimirvЕстественно, это частное решение “а-ля индусский код”, частного случая.
Вам не понравилось решение?
[code python][/code]
Офлайн
0
Я решил проблему:
def main(): imagelist = ['WoodFine01.jpg', 'WoodFine01_DISP.jpg', 'WoodFine01_NRM.jpg', 'WoodFine01_SPEC.jpg', 'WoodFine02.jpg', 'WoodFine02_DISP.jpg', 'WoodFine02_NRM.jpg', 'WoodFine02_SPEC.jpg', 'WoodFine03.jpg', 'WoodFine03_DISP.jpg', 'WoodFine03_NRM.jpg', 'WoodFine03_SPEC.jpg', 'WoodFine04.jpg', 'WoodFine04_DISP.jpg', 'WoodFine04_NRM.jpg', 'WoodFine04_SPEC.jpg', 'WoodFine05.jpg', 'WoodFine05_DISP.jpg', 'WoodFine05_NRM.jpg', 'WoodFine05_SPEC.jpg', 'WoodFlooring042_COL_4K.jpg', 'WoodFlooring042_DISP16_4K.tif'] full_list = [] for shader_name in imagelist: part_name = {} for image in imagelist: filetype = image[-4:] if filetype[-4:-3] != ".": filetype = image[-5:] if len(shader_name) > len(image): short_name = image else: short_name = shader_name part_name_tmp = "" for n in range(len(short_name)): if shader_name[n] == image[n]: part_name_tmp = part_name_tmp + shader_name[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 shader_name] long_part = max(part, key = len) if long_part[-1:] == "_": long_part = long_part[:-1] temp_list = [] for image in imagelist: if long_part in image and image not in temp_list: temp_list.append(image) if temp_list not in full_list: full_list.append(temp_list) for set in full_list: if set != []: print set
Сейчас думаю как оптимизировать написанное.print: ['WoodFine01.jpg', 'WoodFine01_DISP.jpg', 'WoodFine01_NRM.jpg', 'WoodFine01_SPEC.jpg'] ['WoodFine02.jpg', 'WoodFine02_DISP.jpg', 'WoodFine02_NRM.jpg', 'WoodFine02_SPEC.jpg'] ['WoodFine03.jpg', 'WoodFine03_DISP.jpg', 'WoodFine03_NRM.jpg', 'WoodFine03_SPEC.jpg'] ['WoodFine04.jpg', 'WoodFine04_DISP.jpg', 'WoodFine04_NRM.jpg', 'WoodFine04_SPEC.jpg'] ['WoodFine05.jpg', 'WoodFine05_DISP.jpg', 'WoodFine05_NRM.jpg', 'WoodFine05_SPEC.jpg'] ['WoodFlooring042_COL_4K.jpg', 'WoodFlooring042_DISP16_4K.tif']
Отредактировано MR_Magnus (Авг. 9, 2018 16:07:27)
Офлайн
294
MR_Magnusв данном случае вы изменили условие задачи.А если например в ваш список добавить ‘Oak.jpg’ то оно уже не работает.
Я решил проблему:
>>> ['Oak.jpg', 'WoodFine01.jpg', 'WoodFine01_DISP.jpg', 'WoodFine01_NRM.jpg', 'WoodFine01_SPEC.jpg', 'WoodFine02.jpg', 'WoodFine02_DISP.jpg', 'WoodFine02_NRM.jpg', 'WoodFine02_SPEC.jpg', 'WoodFine03.jpg', 'WoodFine03_DISP.jpg', 'WoodFine03_NRM.jpg', 'WoodFine03_SPEC.jpg', 'WoodFine04.jpg', 'WoodFine04_DISP.jpg', 'WoodFine04_NRM.jpg', 'WoodFine04_SPEC.jpg', 'WoodFine05.jpg', 'WoodFine05_DISP.jpg', 'WoodFine05_NRM.jpg', 'WoodFine05_SPEC.jpg', 'WoodFlooring042_COL_4K.jpg', 'WoodFlooring042_DISP16_4K.tif'] ['WoodFine01.jpg', 'WoodFine01_DISP.jpg', 'WoodFine01_NRM.jpg', 'WoodFine01_SPEC.jpg'] ['WoodFine02.jpg', 'WoodFine02_DISP.jpg', 'WoodFine02_NRM.jpg', 'WoodFine02_SPEC.jpg'] ['WoodFine03.jpg', 'WoodFine03_DISP.jpg', 'WoodFine03_NRM.jpg', 'WoodFine03_SPEC.jpg'] ['WoodFine04.jpg', 'WoodFine04_DISP.jpg', 'WoodFine04_NRM.jpg', 'WoodFine04_SPEC.jpg'] ['WoodFine05.jpg', 'WoodFine05_DISP.jpg', 'WoodFine05dsdjl e;t yt nfrjq rhfcsdsq_NRM.jpg', 'WoodFine05_SPEC.jpg'] ['WoodFlooring042_COL_4K.jpg', 'WoodFlooring042_DISP16_4K.tif'] >>>
[code python][/code]
Офлайн
7
PEHDOM
Естественно, это частное решение
PEHDOMЧто за чушь! Все решения - это частный случай. Даже если оно и выглядит более обобщенным.
Представте, более общую картину
# imagelist = [ 'Oak.jpg', 'WoodFine01.jpg', 'WoodFine01_DISP.jpg', 'WoodFine01_NRM.jpg', 'WoodFine01_SPEC.jpg', 'WoodFine02.jpg', 'WoodFine02_DISP.jpg', 'WoodFine02_NRM.jpg', 'WoodFine02_SPEC.jpg', 'WoodFine03.jpg', 'WoodFine03_DISP.jpg', 'WoodFine03_NRM.jpg', 'WoodFine03_SPEC.jpg', 'WoodFine04.jpg', 'WoodFine04_DISP.jpg', 'WoodFine04_NRM.jpg', 'WoodFine04_SPEC.jpg', 'WoodFine05.jpg', 'WoodFine05_DISP.jpg', 'WoodFine05_NRM.jpg', 'WoodFine05_SPEC.jpg', 'WoodFlooring042_COL_4K.jpg', 'WoodFlooring042_DISP16_4K.tif'] def get_roots(files): roots = [] for ifile in files: file_name = ifile.split('.')[0] root = file_name.split('_')[0] roots.append(root) return list(set(roots)) def get_files_with_root(files, root): files_with_root = [] for ifile in files: if ifile.startswith(root): files_with_root.append(ifile) return files_with_root def show(lists): for lst in lists: print(lst) def main(): ready_list = [] roots = get_roots(imagelist) for root in roots: ready_list.append(get_files_with_root(imagelist, root)) show(ready_list) main()
Отредактировано Vladimirv (Авг. 9, 2018 20:29:12)
Офлайн
857
Вообще-то, Vladimirv, написавший код один раз, не должен его переписывать больше под новые данные, на то это и код. Но что мы видим в итоге? У MR_Magnus чуть-чуть поменялись данные для ввода и этот код к ним стал не применим и нужно писать новый код. Так Vladimirv будет писать десять кодов, а потом всё равно окажется, что нужен одиннадцатый.
Так вот, чтобы десять кодов не писать, надо написать один код общего вида. И потом этот код будет применим к данным с разными формами: хоть подчёркивания, хоть корни, хоть картинки, хоть тексты.
Он нигде не сказал, что данные у него фиксированные, да и не бывают они фиксированными. Никто не пишет функцию f(), вычисляющую только 1 + 2, а пишут функцию f(), вычисляющую a + b, так ещё у этих a и b типы целочисленным не ограничиваются. И вообще эти a и b можно дальше абстрагировать до матриц a и b через абстрагирование операции +. А в питоне и матрицы можно складывать, переопределив их операцию сложения, так что в функции f() даже трогать ничего не надо, она уже работает и с целыми числами, и с матрицами, и с векторами. Это питоний полиморфизм.
Отредактировано py.user.next (Авг. 9, 2018 23:34:14)
Офлайн
0
Спасибо всем за помощь, спасибо Vladimirv за хорошее решение.
Офлайн