|
0 / 0 / 0
Регистрация: 18.02.2022
Сообщений: 11
|
|
Нужна критика и советы по работе со списками18.02.2022, 12:03. Показов 1692. Ответов 17
Метки нет (Все метки)
Добрый день!
Программированием в последний раз занимался лет 20 назад (TP 7.0, Delphoi, PHP) - как хобби в школьные годы. Есть небольшая задача по перебору всех возможных сочетаний нагрузок. Написал код на Питоне (не знаком с языком), но мне кажется, что выглядит он очень топорно и как-то "по-паскалевски". Хотелось бы: 1. Услышать критику и советы по оптимизации кода и правильности написания; 2. Имею результат (в целом корректный): ['1*LL1'] ['1*LL2'] ['1*LL3'] ['1*LL1', '0.95*LL2'] ['1*LL1', '0.95*LL3'] ['1*LL2', '0.95*LL1'] ['1*LL2', '0.95*LL3'] ['1*LL3', '0.95*LL1'] ['1*LL3', '0.95*LL2'] ['1*LL1', '0.95*LL2', '0.95*LL3'] ['1*LL1', '0.95*LL3', '0.95*LL2'] ['1*LL2', '0.95*LL1', '0.95*LL3'] ['1*LL2', '0.95*LL3', '0.95*LL1'] ['1*LL3', '0.95*LL1', '0.95*LL2'] ['1*LL3', '0.95*LL2', '0.95*LL1'] Но оптимально удалить из списка дублирующиеся позиции (не соображу пока каким образом это эффективно сделать). Суть в том, что ['1*LL1', '0.95*LL2', '0.95*LL3'] ['1*LL1', '0.95*LL3', '0.95*LL2'] Это для меня идентичные списки - т.к. нагрузка LL1 идет с коэффициентом "1", а в какой последовательности идут нагрузки LL2, LL3 - мне не важно. КОД: from itertools import permutations LL = ['LL1', 'LL2', 'LL3'] #Задаем список длительных нагрузок def splitLoads(loads, x): #Функция перебирает все возможные сочетания нагрузок, как разделитель используется / return ['/'.join(i) for i in permutations(loads, x)] def stringToList(string): #Функция делает из строки список, как резделитель испольуется / listRes = list(string.split("/")) return listRes LL_split = [] #Объявляем пустой спиcок for i in range(len(LL)): LL_split += splitLoads(LL, i+1) LL_list=[[0]*len(LL)]*len(LL_split) #Создаем пустой список нужной длины for i in range(len(LL_list)): #Создаем вложенный список загружений LL_list[i] = stringToList(LL_split[i]) i = 0 n = 0 while i < len(LL_list): #Добавляем коэффициенты сочетаний n = 0 while n < len(LL_list[i]): if n == 0: LL_list[i][n] = '1*' + LL_list[i][n] else: LL_list[i][n] = '0.95*' + LL_list[i][n] n += 1 i +=1 i = 0 while i < len(LL_list): print(LL_list[i]) i += 1 print('Total combinations:' + str(len(LL_list)))
0
|
|
| 18.02.2022, 12:03 | |
|
Ответы с готовыми решениями:
17
Нужна критика и полезные советы! Обсуждаем сайт, нужна критика и советы Нужна критика и советы по сборке, также проверить на совместимость |
|
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
|
|||
| 18.02.2022, 12:34 | |||
|
1
|
|||
|
0 / 0 / 0
Регистрация: 18.02.2022
Сообщений: 11
|
||||||
| 18.02.2022, 13:20 [ТС] | ||||||
0
|
||||||
|
0 / 0 / 0
Регистрация: 18.02.2022
Сообщений: 11
|
|
| 18.02.2022, 15:07 [ТС] | |
|
Не нашел, как сразу результат permutations преобразовать в список, и пример через строку подобрал на форуме.
Если, не затруднит, покажите как можно реализовать иначе. (Первый день общаюсь с Пайтоном, пока сам не сообразил).
0
|
|
|
|
||||||||||||
| 18.02.2022, 15:27 | ||||||||||||
Сообщение было отмечено Xenserus как решение
РешениеВ список вы его и так уже преобразовали использовав list comprehensions:
0
|
||||||||||||
|
0 / 0 / 0
Регистрация: 18.02.2022
Сообщений: 11
|
|
| 18.02.2022, 15:28 [ТС] | |
|
Но permutation выдает на выходе Tuple, а не список.
0
|
|
|
|
||||||
| 18.02.2022, 15:32 | ||||||
|
Xenserus,
кортеж это частный результат одной итерации permutations. Общий - список кортежей. Добавлено через 2 минуты Вам нужен плоский список всех вариантов? Пожалуйста:
0
|
||||||
|
0 / 0 / 0
Регистрация: 18.02.2022
Сообщений: 11
|
|
| 18.02.2022, 15:43 [ТС] | |
|
Я пытался получить:
i = [['1', '2', '3', '4'], ['1', '2', '4', '3'], ['1', '3', '2', '4']], потому что не понял как обращаться к i [('1', '2', '3', '4'), ('1', '2', '4', '3'), ('1', '3', '2', '4').... - i[1][2] - не получилось =) Это, видимо, у меня в памяти двумерные массивы >>>
0
|
|
|
|
|||||||||||
| 18.02.2022, 15:50 | |||||||||||
Сообщение было отмечено Xenserus как решение
Решение
кортеж -> list
Доступ по индексу работает и для кортежей:
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 18.02.2022
Сообщений: 11
|
|
| 18.02.2022, 15:55 [ТС] | |
|
Огромное спасибо за ответ, объяснение и терпимость!
Уже прочитал, что кортежи неизменяемы, поэтому лучше останусь на списках, так как еще необходимо решить проблему с дублирующимися комбинациями нагрузок. "Но оптимально удалить из списка дублирующиеся позиции (не соображу пока каким образом это эффективно сделать). Суть в том, что ['1*LL1', '0.95*LL2', '0.95*LL3'] ['1*LL1', '0.95*LL3', '0.95*LL2'] Это для меня идентичные списки - т.к. нагрузка LL1 идет с коэффициентом "1", а в какой последовательности идут нагрузки LL2, LL3 - мне не важно."
0
|
|
|
|
|||||||
| 18.02.2022, 16:35 | |||||||
0
|
|||||||
|
0 / 0 / 0
Регистрация: 18.02.2022
Сообщений: 11
|
|
| 19.02.2022, 06:56 [ТС] | |
|
Небольшая исходная - около 50 нагрузок, но комбинаций будут тысячи или десятки тысяч.
0
|
|
|
0 / 0 / 0
Регистрация: 18.02.2022
Сообщений: 11
|
|||||||||||
| 19.02.2022, 12:13 [ТС] | |||||||||||
|
Вроде бы, получше стало выглядеть:
Да уж, промахнулся ![]() При 10 заданных исходных нагрузках, получается: Total combinations: 9864100 Total combinations without duples:: 5120 При этом почему-то очень долго работает именно:
0
|
|||||||||||
| 19.02.2022, 12:13 | |
|
Помогаю со студенческими работами здесь
18
Нужна конструктивная критика: советы, замечания по заданному фрагменту кода
jQuery-ajax плагин выпадающего дерева (нужна критика и советы) Написал код, нужна критика и советы как можно было бы сделать лучше
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|