с 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))