Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 9, 2018 15:28:26

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

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

PEHDOM
Vladimirv серьезно?
Вопрос не понял. Вам не понравилось решение?

Офлайн

#2 Авг. 9, 2018 16:05:28

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

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

Vladimirv
Вам не понравилось решение?
Естественно, это частное решение “а-ля индусский код”, частного случая.
Топикстартер просто привел простой пример.
Представте, более общую картину: у вас список состоит не из 12-ти элементов а хотябы из 1000, и вы заранее не знаете какие там слова и какие у них могут быть корни.



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

Офлайн

#3 Авг. 9, 2018 16:06:56

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

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

Я решил проблему:

 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)

Офлайн

#4 Авг. 9, 2018 16:22:50

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

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

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]
Бериегите свое и чужое время.

Офлайн

#5 Авг. 9, 2018 20:27:51

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

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

PEHDOM
Естественно, это частное решение
PEHDOM
Представте, более общую картину
Что за чушь! Все решения - это частный случай. Даже если оно и выглядит более обобщенным.

Например, (упс! Пример уже частный случай! ) MR_Magnus предполагает, что в директории находятся только картинки(это частный случай), а не какие-то zip, txt или что-то там еще. При этом его явно интересуют картинки. Это видно из его кода.

Дальше, а что, если файл img.jpg это текстовый файл или вообще исполняемый? Если картинки будут дальше где-то использоваться, могут быть сюрпризы.

А теперь общий случай, кстати он у вас, звучит так: “нет решения, нет вашего кода”. И он подходит для любой задачи, для любого языка а не только python, для любого форума, места и времени. Его можно применять везде, где нужно решение)))

Насчет постановки задачи, она поставлена довольно таки не плохо и ясно.
Дано что поступает на вход и что должно быть на выходе. ЯП известен, что еще нужно? Если не нравится формулировка задачи, предложите свою. MR_Magnus, думаю, примет к сведению а возможно и кто-то еще на форуме, и будут правильно ставить вопросы. А так, “мне не нравится формулировка задачи” это не о чем, нужен правильный пример.

Кстати, MR_Magnus, неплохо себя себя показал, код в тегах, название темы соответствует, постановка задачи меня устраивает, плюс он не сидел и ждал когда ему решат а продолжал искать решение сам. Если взять “общую температуру по больнице”, то было бы не плохо если все новобранцы на форуме начинали с этого уровня.

Вернемся к делу, я написал решение, которое решало поставленную задачу. Дальше просто его нужно довести до некоторого подходящего варианта, в вашей формулировке “обобщить”. Самим слабо это сделать, вы же типа программисты, что за дела? Например, вот так:
 #
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()
MR_Magnus плохо использовать имена переменных, как у встроенных в python функций. Я про set. Еще есть len, min, max, next, continue и т.д.

Отредактировано Vladimirv (Авг. 9, 2018 20:29:12)

Офлайн

#6 Авг. 9, 2018 23:30:31

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

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

Вообще-то, 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)

Офлайн

#7 Авг. 14, 2018 13:43:14

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

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

Спасибо всем за помощь, спасибо Vladimirv за хорошее решение.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version