TGTGInsighttelegram intelligenceLIVE / telegram public index
← Python Заметки
Python Заметки avatar

TGINSIGHT POST

Post #17

@pythonotes

Python Заметки

Views422Post view count
PostedJan 1401/14/2020, 09:00 AM
Post content

Post content

Допустим, есть некий массив a = [1, 2, 3] Как мы переберём все элементы? Это очевидно. for x in a: print(x) Как это сделать с помощью генератора списка (list comprehension)? r = [x for x in a] Добавим еще один массив b = 'abc' Теперь нам нужно перебрать все возможные сочетания из этих двух списков. Тоже не проблема: for x in a: for y in b: print(x, y) Можно ли такой алгоритм повторить с помощью генератора списка? На самом деле можно >>> [[x, y] for x in a for y in b] [[1, 'a'], [1, 'b'], [1, 'c'], [2, 'a'], ...] А если добавить еще один список? >>> c = ('yes', 'no', 'maybe') >>> r = [[x, y, z] for x in a for y in b for z in c] [[1, 'a', 'yes'], [1, 'a', 'no'], [1, 'a', 'maybe'], ...] Получаем список списков, в которых есть все варианты комбинаций по 3 элемента. В следующем коде круглыми скобками показаны части разных итераций, чтобы было понятно чо во что входит. Код не для исполнения! [( ( ([x, y, z] for x in a) for y in b) for z in c)] Генераторы списков это круто, но когда используются без фанатизма! Всегда помните: Простое лучше чем сложное (Simple is better than complex). И на последок пример: vectors = [[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[10, 11, 12], [13, 14, 15]]] print([digit for part in vectors for elem in part for digit in elem]) Попробуйте понять что там происходит и что распечатает этот код 😭😵🤪 Это хороший пример того, как не стоит усложнять читаемость кода. PS. Да, "генераторы" в Python это другая сущность, но как-то иначе удачно перевести comprehension не получается. Ну не называть же их "пониматоры" списков) PPS. Для получения множества комбинаций лучше используйте itertools.combinations #tricks