Путевые заметки в процессе познания Python и PyQt/PySide.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.
К вопросу о транспонировании...
Запись от iamvic размещена 09.09.2024 в 15:14
Метки python 3
Просто оставлю это здесь в качестве памятки. Заниматься-то транспонированием приходится крайне редко, а тут такой интересный эффект обнаружился с транспонированием списка строк (смотри К вопросу о построении дерева родительских отношений в PyQt (часть 4)). Прямого упоминания о такой возможности я как-то даже и не нашёл (видимо, считается само собой разумеющимся, а для меня оказалось сюрпризом). Пошарив по Интернету, надёргал разных решений (каждый может узнать своё ) и налепил демонстратор: transposer.py:
А вот результаты интересные: 1. numpy автоиммунен к транспонированию списка строк (тупо ничего не делает), 2. sympy валится в ошибки (даже не буду приводить пример), 3. а остальные бодро транспонируют список строк в матрицу, не смотря на очевидную разницу в подходах:
Всем спасибо! |
Всего комментариев 8
Комментарии
-
Запись от AlexProgramm размещена 10.09.2024 в 11:55 -
AlexProgramm, спасибо за поддержку
Мне тут молодёжь моя уже высказалась, что наконец-то найден самый питонистый из пропитоньевых способов преобразования списка строк одинаковой длины в матрицу. Даже сляпали функцию соответствующую
Python 1 2 3 4 5 6 7 8 9 10 11
def los2mat(x): '''los2mat(x) - convert x (as list of strings) to matrix''' y = [[x[j][i] for j in range(len(x))] for i in range(len(x[0]))] return [[y[j][i] for j in range(len(y))] for i in range(len(y[0]))] if __name__ == '__main__': z = ['Один 1', 'Zwei 2', 'Пять 5', 'Сinque'] print(los2mat(z))
Ну, не может же быть такого, чтобы этот момент был упущен. Питону уж столько лет, что все эти особенности должны были бы быть выявлены и документированы. Но я никак не могу найти прямого указания на такую возможность. Да и времени-то особо нет, чтобы заниматься этим.Запись от iamvic размещена 11.09.2024 в 14:12 -
Выглядит страшновато
Как устроен питон и сколько раз будет вызвано, например, range(len(x)) ?Запись от voral размещена 12.09.2024 в 13:57 -
Хотя, у меня не полный аналог - в моем варианте строки могут быть разной длины. Но тут просто mb_str_split вынести в функцию, в которой еще (если по аналогии с вашим кодом) обрезать по количеству символов в первой строке.
PHP 1 2 3
<?php $z = ['Один 1', 'Zwei 2', 'Пять 5', 'Сinque']; print_r(array_map('mb_str_split', $z));
Запись от voral размещена 12.09.2024 в 14:09
Обновил(-а) voral 12.09.2024 в 14:12 -
Python 1 2 3 4 5 6 7 8 9 10 11 12 13
def los2mat(x): '''los2mat(x) - convert x (as list of strings) to matrix''' result = [] for item in x: result.append([oneChar for oneChar in item]) return result; if __name__ == '__main__': z = ['Один 1', 'Zwei 2', 'Пять 5', 'Сinque'] print(los2mat(z))
Запись от voral размещена 12.09.2024 в 14:19 -
Еще поиздевался над вашим питоном
Python 1 2 3 4 5 6 7 8 9 10
def los2mat(x): '''los2mat(x) - convert x (as list of strings) to matrix''' return [[oneChar for oneChar in item] for item in x]; if __name__ == '__main__': z = ['Один 1', 'Zwei 2', 'Пять 5', 'Сinque'] print(los2mat(z))
Запись от voral размещена 12.09.2024 в 14:25 -
Цитата:Еще поиздевался над вашим питоном
Python 1 2 3 4 5 6 7 8 9 10
def los2mat(x): '''los2mat(x) - convert x (as list of strings) to matrix''' return [[oneChar for oneChar in item] for item in x]; if __name__ == '__main__': z = ['Один 1', 'Zwei 2', 'Пять 5', 'Сinque'] print(los2mat(z))
Запись от iamvic размещена 17.09.2024 в 16:12 -
voral, ещё раз спасибо огромное за подсказки, мне хоть удалось понять, что на самом деле надо было подкрутить в первую очередь... Ваш намёк на обработку строк разной длины оказался решающим аргументом. Решение может быть выглядит в моём исполнении неказисто, но зато существенно облегчает обратную операцию - сброку списка строк из матрицы. Плюс не надо выравнивать исходные строки по длине с помощью символа-заполнителя, что было весьма рискованно.
Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
def los2mat(x): '''los2mat(x) - convert x (as list of strings) to matrix''' l_max = 0 for item in x: l_max = len(item) if l_max < len(item) else l_max result = [] for item in x: result.append([oneChar for oneChar in item]) for ix in result: l_ix = len(ix) if l_max > l_ix: for t in range(l_max - l_ix): ix.append('') return result if __name__ == '__main__': z = ['Один 1', 'Zwei 22', 'Пять 55555', 'Сinque'] print(los2mat(z))
Запись от iamvic размещена 22.09.2024 в 19:04