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

Реструктурировать вложенные списки Python

Допустим, у нас есть вложенный список с 3 уровнями (D1=2,D2=3,M=2), например:

l = [[[1,a],[2,b],[3,c]], [[4,d],[5,e],[6,f]]]

Я пытаюсь выяснить, есть ли какой-либо питонический способ построить 2 новых вложенных списка с 2 уровнями (D1 = 2, D2 = 3), например:

l1 = [[1,2,3], [4,5,6]]
l2 = [[a,b,c], [d,e,f]]

Тогда у нас может быть N уровней, а списки на самом глубоком уровне содержат M элементов (D1,D2,D3,..., D_N-1,M), цель всегда состоит в том, чтобы построить вложенные M списков с N-1 уровнями.

Другими словами, нам нужно сохранить иерархию, разделив нижний уровень.

Другой пример:

l = [[[[13076, 0, 0], [806, 0, 0]], [[13076, 0, 0], [2, 0, 0]]]], [[[[2066, 0, 0], [8, 0, 0]], [[42, 0, 0], [4147, 0, 0]]]]

l1 = [[[13076,806], [13076,2]], [[2066,8],[42,4147]]]
l2 = [[[0,0], [0,0]], [[0,0], [0,0]]]
l3 = [[[0,0], [0,0]], [[0,0], [0,0]]]
12.03.2018

Ответы:


1

Для произвольной глубины вы можете использовать рекурсию:

def transpose(s):
  return list(map(list, zip(*[list(map(list, zip(*i))) if all(all(not isinstance(c, list) for c in h) for h in i) else transpose(i) for i in s])))

l = [[[[13076, 0, 0], [806, 0, 0]], [[13076, 0, 0], [2, 0, 0]]]], [[[[2066, 0, 0], [8, 0, 0]], [[42, 0, 0], [4147, 0, 0]]]]
l2 = [[[1,'a'],[2,'b'],[3,'c']], [[4,'d'],[5,'e'],[6,'f']]] 
new_data1 = {'l{}'.format(i):a for i, a in enumerate(transpose(l), start=1)}
new_data2 = {'l{}'.format(i):a for i, a in enumerate(transpose(l2), start=1)}

Выход:

{'l2': [[[[0, 0], [0, 0]]], [[[0, 0], [0, 0]]]], 'l3': [[[[0, 0], [0, 0]]], [[[0, 0], [0, 0]]]], 'l1': [[[[13076, 806], [13076, 2]]], [[[2066, 8], [42, 4147]]]]}

{'l2': [['a', 'b', 'c'], ['d', 'e', 'f']], 'l1': [[1, 2, 3], [4, 5, 6]]}
12.03.2018
  • Спасибо, но здесь вы подразумеваете типы элементов внутреннего списка, и выходные данные также смешаны... 12.03.2018
  • @kiddo type(c) in [int, str] подразумевает, что внутренние элементы могут быть либо целыми числами, либо строками. Можете ли вы опубликовать пример того, как выглядят ваши более глубокие вложенные данные? 12.03.2018
  • в настоящее время есть только целые числа, мне просто интересно, можно ли это распространить на любой тип... Можно ли исправить вывод, как в вопросе? Эти списки на самом деле представляют собой входные функции, которые необходимо передать в нейронную сеть, а это означает, что нам нужно передать три параллельных списка, чтобы встроить эти разные функции, которые относятся к одной и той же точке данных... 12.03.2018
  • @kiddo Пожалуйста, посмотрите мое недавнее редактирование. Я изменил решение для поддержки значений произвольных типов. 12.03.2018
  • Отлично, мы можем получить результат в таком виде? l1 = [[1,2,3], [4,5,6]] l2 = [[a,b,c], [d,e,f]] 12.03.2018
  • Пожалуйста, посмотрите новый список (l) внизу вопроса, первый шаг транспонирования работает нормально, но затем, если я вызову l1, l2, l3 = map(list, zip(*transpose(l))), я получаю ValueError: недостаточно значений для распаковки (ожидалось 3, получено 1). Я думаю, теперь мы подразумеваем количество выходных списков :) 12.03.2018

  • 2

    Синтаксис numpy удобен для этой задачи:

    import numpy as np
    
    l = [[[1, 'a'], [2, 'b'], [3, 'c']],
         [[4, 'd'], [5, 'e'], [6, 'f']]]
    
    a = np.array(l)
    
    l1 = a[:, :, 0].astype(int).tolist()
    
    # [[1, 2, 3], [4, 5, 6]]
    
    l2 = a[:, :, 1].tolist()
    
    # [['a', 'b', 'c'], ['d', 'e', 'f']]
    
    12.03.2018
  • Любое решение, которое не подразумевает знание вложенной глубины? 12.03.2018

  • 3

    Вы просто делаете:

    l1=[[i[0] for i in j] for j in l]
    l2=[[i[1] for i in j] for j in l]
    
    12.03.2018
  • Любое решение, которое не подразумевает знание вложенной глубины? 12.03.2018
  • @kiddo это не кажется таким простым, не зная об этом, но, возможно, стоит адаптироваться: stackoverflow.com/questions/6039103/ 12.03.2018

  • 4

    Использовать карту внутри карты

    l = [[[1,"a"],[2,"b"],[3,"c"]], [[4,"d"],[5,"e"],[6,"f"]]]
    l1 = list(map(lambda x: list(map(lambda y: y[0], x)), l))
    l2 = list(map(lambda x: list(map(lambda y: y[1], x)), l))
    
    12.03.2018
  • Любое решение, которое не подразумевает знание вложенной глубины? 12.03.2018
  • Новые материалы

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

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

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

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

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

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

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