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

Объединить списки кортежей по парам в определенную длину нового списка кортежей

Я новичок в Python. Я пытаюсь объединить два списка кортежей попарно в один список кортежей, где кортежи имеют определенную длину (скажем, 8):

Например,

ввод:

x = [(0,1,2,3),(4,5,6,7),(8,9,10,11)]
y = [('a','b','c','d'),('e','f','g','h'),('i','j','k','l')]

вывод:

[('a', 0, 'b', 1, 'c', 2, 'd', 3),
 ('e', 4, 'f', 5,'g', 6, 'h', 7),
 ('i', 8, 'j', 9, 'k', 10, 'l', 11)]

Я пробовал несколько разных циклов, которые пытаются объединить кортежи попарных комбинаций, а затем добавить их для заданной длины, но безуспешно. Смотри ниже.

new = []
for n in range(len(x)):
    for p in range(len(x[n])):
        if p == len(x[n])-1:
            new += [(x[n][p],y[n][p])]
            for v in range(len(x[n])):
                newer += new[v]
        else:
            new += [(x[n][p],y[n][p])]

Приведенный выше «новый» список бесполезен, но «новый» список предоставляет попарную комбинацию кортежей, которые я ищу, как я полагаю, по крайней мере, слияние().

[('a', 0),('b', 1),('c', 2),('d', 3),('e', 4),('f', 5),('g', 6),('h', 7),('i', 8) ('j', 9),('k', 10), ('l', 11)]

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

Любые другие решения приветствуются.

06.02.2020

  • Извините, я думаю, что это была опечатка в моем первоначальном сообщении. Ясно, ты разобрался! Спасибо, что поделились своей мудростью. 06.02.2020

Ответы:


1

Использование буфера:

b = [None] * 8
[tuple(b) for b[::2], b[1::2] in zip(y, x)]
06.02.2020
  • Вау - это красиво. Я не знал, что вы можете динамически изменять вторую переменную в таком понимании списка. Это должен быть принятый ответ 06.02.2020
  • @AaronZolnai-Lucas Да, я счастлив каждый раз, когда могу использовать этот трюк. Здесь другой случай (хотя понимание dict). 06.02.2020
  • Сначала это выглядело очень интересно, но теперь мне это не очень нравится, потому что на самом деле это просто мутация b, и такие побочные эффекты в понимании списка не такие питонические. Просто используйте вместо этого цикл for, если вы хотите такое поведение 06.02.2020
  • @jamylak Мы могли бы иметь b строго внутри понимания списка с [tuple(b) for b in [[None] * 8] for b[::2], b[1::2] in zip(y, x)] (после этого он даже не существует). Хотя мне это нравится меньше. Я думаю, что это также зависит от контекста. Представьте, что эти две строки инкапсулированы в функцию (поэтому функция ничего не делает и возвращает список). Тогда этот побочный эффект очень локален. 06.02.2020
  • Это значительно расширяет мой кругозор Python — спасибо, ребята, за эту тему! Не могли бы вы указать мне направление чтения, которое я могу сделать, чтобы понять динамические изменения, которые вы делаете, и мутацию jamylak, на которую ссылается понимание списка? Это та часть, которую я не совсем понимаю. 06.02.2020
  • @marjorieisacat Это просто назначения срезов, изменяющие внешнюю переменную b. У меня нет под рукой хорошего учебника или около того, мне тоже нужно его поискать. 06.02.2020
  • Хорошо, поймал. Буду разбираться :). Спасибо еще раз! 06.02.2020
  • @HeapOverflow Это тоже не выглядит питоническим. Вы должны изменить это на обычный цикл for или удалить побочные эффекты. 08.02.2020

  • 2

    Начните с объединения ваших подсписков в списки совпавших пар:

    pair_list = [list(zip(a, b)) for a, b in zip(x, y) ]
    

    Результат:

    [[(0, 'a'), (1, 'b'), (2, 'c'), (4, 'd')],
     [(5, 'e'), (6, 'f'), (7, 'g'), (8, 'h')],
     [(9, 'i'), (10, 'j'), (11, 'k'), (12, 'l')]]
    

    Теперь просто сгладьте внутренние списки. Вы можете найти простое сглаживание как «упражнение для ученика», хорошо?

    06.02.2020
  • Я бы изменил внешний list(... for a, b in ...) на чистый список comp [... for a, b in ...] 06.02.2020
  • @AaronZolnai-Lucas Как вы пришли к такому выводу? Здесь нет ничего, что жестко кодировало бы длину ввода. 06.02.2020
  • Точно. Вы получите только 8, потому что оно кратно 4, что и является заданной длиной. Если бы вас попросили сделать 7-кортежи, чередующиеся из 2 списков 3-кортежей, это не сработало бы. 06.02.2020
  • Это не проблема. OP просит объединить списки одинаковой длины в x и y со списками вдвое большей длины. len(x[i]) == len(y[i]) для всех i. 06.02.2020
  • На самом деле это то, что я в конечном итоге сделал со своей стороны, что-то определенно не так с моей версией, поскольку рамка считывания, которую я построил, не останавливается на правильной длине. Благодарю вас! 06.02.2020

  • 3

    (Опубликовано решение от имени автора вопроса, чтобы переместить его в пространство для ответов).

    В итоге я получил что-то для работы:

    final_list = []
    for outer in range(len(a)):
        for ele in range(len(a[outer])):
            if ele == 0:
               slice_start = 0
            else: 
               slice_start += len(b[ele-1])
               slice_end = len(b[ele])+slice_start
               capture = [target for sublist in a[slice_start:slice_end] for target in sublist]
               final_list.append(capture)
    final_list = final_list[:len(a)]
    

    Определенно не так красиво, как ответ heap_overflow.

    08.02.2020
    Новые материалы

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

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

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

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

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

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

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