Nano Hash - криптовалюты, майнинг, программирование

Python: преобразовать список списков кортежей

Предположим, у меня есть следующая структура данных:

[[ tuple11,
   tuple12,
   ... ],
 [ tuple21,
   tuple22,
   ... ],
 ...]

То есть внешний список может иметь любое количество элементов и каждый элемент (список) может содержать любое количество элементов (кортежей). Как я могу преобразовать его в:

[[ tuple11,
   tuple21,
   ... ],
 [ tuple12,
   tuple22,
   ... ],
 ... ]

У меня есть следующее решение, работающее для двух элементов во внешнем списке, но я не могу понять, как его обобщить:

map(lambda x, y: [x, y], *the_list)

Добавлено:

Просто чтобы добавить больше деталей, каждый из приведенных выше кортежей на самом деле является кортежем из двух np.array.

Если я начну со следующей структуры данных:

[[(array([111, 111]), array([121, 121])),
  (array([112, 112]), array([122, 122])),
  (array([131, 131]), array([141, 141])),
  (array([132, 132]), array([142, 142]))],
 [(array([211, 211]), array([221, 221])),
  (array([212, 212]), array([222, 222])),
  (array([231, 231]), array([241, 241])),
  (array([232, 232]), array([242, 242]))]]

Мне нужно превратить это в:

[[(array([111, 111]), array([121, 121])),
  (array([211, 211]), array([221, 221]))],
 [(array([112, 112]), array([122, 122])),
  (array([212, 212]), array([222, 222]))],
 [(array([131, 131]), array([141, 141])),
  (array([231, 231]), array([241, 241]))],
 [(array([132, 132]), array([142, 142])),
  (array([232, 232]), array([242, 242]))]]

Обратите внимание, что массивы не всегда 1✕2, а обычно 1✕N для любого положительного N. Всегда есть два массива в каждом кортеже, но любое количество кортежей в каждом внутреннем списке и любое количество этих внутренних списков во внешнем списке.

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

28.07.2015

Ответы:


1

Вам нужны столбцы, поэтому вы можете использовать функцию zip:

zip(*main_list)

Но поскольку он возвращает столбцы в формате кортежа, если вам нужен только список, вы можете использовать map для преобразования их в список:

map(list,zip(*main_list))

Демо:

>>> main_list=[[(1,2),(3,4)],[(5,6),(7,8)]]
>>> zip(*main_list)
[((1, 2), (5, 6)), ((3, 4), (7, 8))]

И на вашем примере:

>>> main_list=[[(np.array([111, 111]), np.array([121, 121])),
...   (np.array([112, 112]), np.array([122, 122])),
...   (np.array([131, 131]), np.array([141, 141])),
...   (np.array([132, 132]), np.array([142, 142]))],
...  [(np.array([211, 211]), np.array([221, 221])),
...   (np.array([212, 212]), np.array([222, 222])),
...   (np.array([231, 231]), np.array([241, 241])),
...   (np.array([232, 232]), np.array([242, 242]))]]
>>> 
>>> zip(*main_list)
[((array([111, 111]), array([121, 121])), (array([211, 211]), array([221, 221]))), 
((array([112, 112]), array([122, 122])), (array([212, 212]), array([222, 222]))), 
((array([131, 131]), array([141, 141])), (array([231, 231]), array([241, 241]))), 
((array([132, 132]), array([142, 142])), (array([232, 232]), array([242, 242])))]
28.07.2015
  • Хм, кажется, здесь есть оговорка, и ваш ответ не работает в моем конкретном случае. Каждый из моих tuple11 и т. д. на самом деле является кортежем из двух 1x2 np.array, и, по-видимому, ваш подход заканчивается объединением этих массивов в 2x2 np.array. Я добавляю дополнительную информацию к вопросу, чтобы прояснить это... 28.07.2015
  • @ThomasArildsen Это не имеет значения, проверьте правку. 28.07.2015
  • Вы абсолютно правы. Оказывается, я случайно проверил ваш подход на другой структуре данных, которая была у меня в рабочей области, с немного другим макетом. Извиняюсь... 29.07.2015

  • 2

    Кажется, я нашел решение. Я не считаю это элегантным, но, по крайней мере, это работает. Назовем исходный список списков кортежей main_list, а преобразованный список списков кортежей new_list:

    def transform_coeff_struct(main_list):
    
        new_list = []
        for ii, inner_list in enumerate(main_list):
            for jj, some_tuple in enumerate(inner_list):
                if ii==0:
                    new_list.append([some_tuple,])
                else:
                    new_list[jj].append(some_tuple)
        return new_list
    
    28.07.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..