Хобрук: Ваш путь к мастерству в программировании

Создание матрицы индексов/координат из другого списка

Извините, если на подобный вопрос уже был дан ответ, но я внимательно посмотрел и не нашел решения. Я относительно новичок в Pyhton.

Я пытаюсь создать матрицу индексов/координат для всех возможных двумерных списков (набор подсписков разного размера, список), чтобы учесть все возможные комбинации элементов.

Если бы мой список был [[A, B, C]], создаваемая матрица была бы [[0], [1], [2]], где первый и единственный элемент каждого списка относится к положению подсписка внутри списка. Если бы мой список был [[A, B, C], [A, B, C, D]], матрица должна была бы дать:

[[0, 0], [0, 1], [0, 2], [0, 3],
 [1, 0], [1, 1], [1, 2], [1, 3],
 [2, 0], [2, 1], [2, 2], [2, 3]]

И так далее. Каждый подсписок имеет длину, равную количеству подсписков в исходном списке. Содержимое начального списка не имеет значения, но порядок имеет значение, поскольку в результате позиция 0 каждого подсписка представляет собой координату элемента в подсписке 0 и так далее.

По сути, это представляет все комбинации элементов среди подсписков, что-то вроде декартова произведения.

Я предполагаю, что это можно сделать с помощью какого-то понимания списка, но не смог найти ответ.


Ответы:


1

Вы ищете itertools.product:

>>> import itertools
>>> lists = [['A', 'B', 'C'], ['A', 'B', 'C', 'D']]
>>> list(itertools.product(*lists))
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('A', 'D'),
 ('B', 'A'), ('B', 'B'), ('B', 'C'), ('B', 'D'),
 ('C', 'A'), ('C', 'B'), ('C', 'C'), ('C', 'D')]

Вернее, произведение индексов, так что просто используйте ranges соответствующих размеров вместо исходных списков.

>>> list(itertools.product(*(range(len(x)) for x in lists)))
[(0, 0), (0, 1), (0, 2), (0, 3),
 (1, 0), (1, 1), (1, 2), (1, 3),
 (2, 0), (2, 1), (2, 2), (2, 3)]
15.12.2014
  • Или, я полагаю, [list(y) for y in itertools.product(*(range(len(x)) for x in lists))] если вам нужен список списков 15.12.2014
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..