Как объединить 1D и 2D кортежи в Python? - PullRequest
0 голосов
/ 21 сентября 2018

Как объединить одномерные и двумерные кортежи в Python?

Итак, учитывая два списка

heights = (   165,     152,     145,    174)
pos_2D  = ( (2,3), (32,52), (73,11), (43,97) )

Я бы хотел что-то вроде

pos_3D = merge(heights, pos_2D)

, где

pos_3D = ( (2,3,165), (32,52,152), (73,11,145), (43,97,174) )

Какой питонский способ сделать это?

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Они не совсем 1D или 2D.Первый - это просто кортеж целых чисел, а второй - кортеж кортежей.Итак, вы просто проходите их параллельно (используя zip) и создаете новый элемент кортежа для каждой пары элементов

result = tuple( (*pos, h) for pos, h in zip(pos2D, heights))
0 голосов
/ 21 сентября 2018

с zip

zip(heights,*zip(*pos_2D))

>>>[(165, 2, 3), (152, 32, 52), (145, 73, 11), (174, 43, 97)]

или, если хотите, tuple

tuple(zip(heights,*zip(*pos_2D)))
>>>((165, 2, 3), (152, 32, 52), (145, 73, 11), (174, 43, 97))

zip составляет список кортежей из двух аргументов, а zip(*_) охватываетвозвращает к отдельным аргументам (думайте об этом, как о распаковке).

Пояснения к коду.

heights = (   165,     152,     145,    174)
pos_2D  = ( (2,3), (32,52), (73,11), (43,97) )

Со вторым кортежем pos_2D мы можем разархивировать его для отдельных аргументов как

pos_2D_unzipped = zip(*pos_2D)
print pos_2D_unzipped
>> [(2, 32, 73, 43), (3, 52, 11, 97)]

, теперь мы можем использоватьэто чтобы сжать heights и pos_2D_unzipped вместе, чтобы получить то, что вы хотите.

для этого мы можем сделать что-то вроде zip(heights, pos_2D_unzipped), но это только застегивает первые 2 элемента zip с двумя длинными кортежами pos_2D_unzipped.

zip(heights, pos_2D_unzipped)
[(165, (2, 32, 73, 43)), (152, (3, 52, 11, 97))]

Что вам действительно нужно сделать: предоставить zip три аргумента: 1. heights, 2. первый элемент pos_2D_unzipped и 3. второй элемент pos_2D_unzipped

, чтобы вы могли сделать что-то вроде:

zip(heights, pos_2D_unzipped[0],pos_2D_unzipped[1])
>>[(165, 2, 3), (152, 32, 52), (145, 73, 11), (174, 43, 97)]

Что работает!Но вы можете сделать что-то быстрее.pos_2D_unzipped - это список из двух элементов (которые являются длинными кортежами), было бы здорово, если бы вы могли передать каждый элемент списка непосредственно в zip.И это именно то, что *pos_2D_unzipped делает в сторону zip(__).Он открывает список в отдельные аргументы для функции.

Таким образом, теперь вы можете сделать,

zip(heights, *pos_2D_unzipped)
>>[(165, 2, 3), (152, 32, 52), (145, 73, 11), (174, 43, 97)]

И даже лучше, теперь вы можете сжать два шага распаковки pos_2D и архивирования heights и pos_2D_unzipped в одиншаг.

zip(heights,*zip(*pos_2D))

0 голосов
/ 21 сентября 2018

Использование zip

Пример:

heights = (   165,     152,     145,    174)
pos_2D  = ( (2,3), (32,52), (73,11), (43,97) )

print(tuple(j + (i,) for i, j in zip(heights, pos_2D)) )

Выход:

((2, 3, 165), (32, 52, 152), (73, 11, 145), (43, 97, 174))
...