Как добавить элементы в пару координат, чтобы составить многомерный список? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть список, содержащий пару координат следующим образом:

index = [(1, 4), (3, 6), (7, 10), (3, 9)]

Теперь у меня есть список с таким же размером, как показано ниже:

size = [2, 2, 4, 4]

Теперь я хотел бы добавить "size" to "index", чтобы выглядеть следующим образом:

new = [(1,4,2), (3,6,2), (7,10,4), (3,9,4)]

Я пробовал несколько вещей, таких как "zip" или "numpy .dstack ((index, size)) .shape "

, но не дает мне желаемый формат.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 25 марта 2020

Вы можете использовать понимание списка с zip для агрегирования обоих итераций, затем создать новый кортеж, распаковав кортежи в index и добавив к нему целые числа в size:

[(*i,j) for i,j in zip(index, size)]
# [(1, 4, 2), (3, 6, 2), (7, 10, 4), (3, 9, 4)]
2 голосов
/ 25 марта 2020

Вы можете попробовать это.

[i+(j,) for i,j in zip(index,size)]
# [(1, 4, 2), (3, 6, 2), (7, 10, 4), (3, 9, 4)]

Анализ времени:

# When list size is 4
In [142]: timeit [(*i,j) for i,j in zip(index, size)] #yatu's answer
1.24 µs ± 72.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [144]: timeit [i+(j,) for i,j in zip(index,size)] #Ch3steR's answer
902 ns ± 28.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Когда список кортежей размером более 10000.

In [149]: timeit [(*i,j) for i,j in zip(index, size)]
1.68 ms ± 77.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [150]: timeit [i+(j,) for i,j in zip(index,size)]
1.18 ms ± 27.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Немного быстрее, чем распаковывать подход

...