У меня есть набор целых чисел, таких как (1, 2, 3, 4, 5)
, и я хочу создать набор (1*2, 2*3, 3*4, 4*5)
путем умножения смежных элементов. Можно ли сделать это с помощью однострочного лайнера?Умножьте смежные элементы
ответ
Sh орт и сладкий. Помните, что zip
работает только до кратчайшего ввода.
print tuple(x*y for x,y in zip(t,t[1:]))
>>> t = (1, 2, 3, 4, 5)
>>> print tuple(t[i]*t[i+1] for i in range(len(t)-1))
(2, 6, 12, 20)
Не самый pythonic решений, хотя.
+1 Кажется достаточно хорошо. Почему это не самый Pythonic? –
@PaulManta [Дело в точках] (http://stackoverflow.com/a/14917025/1907098) – Volatility
@Volatility Прокомментируйте ответ Евгении. – eyquem
Если т Ваш кортеж:
>>> tuple(t[x]*t[x+1] for x in range(len(t)-1))
(2, 6, 12, 20)
И еще одно решения с прекрасной картой:
>>> tuple(map(lambda x,y:x*y, t[1:], t[:-1]))
(2, 6, 12, 20)
Edit: А если вы беспокоитесь о дополнительном расходе памяти ломтиков, вы можете использовать из itertools, который будет перебирать ваш кортеж (thx @eyquem):
>>> tuple(map(lambda x,y:x*y, islice(t, 1, None), islice(t, 0, len(t)-1)))
(2, 6, 12, 20)
Первый - основное благо. Второе не так хорошо, потому что '' t [1:] '' создает совершенно новый объект, а 't [: 1]' 'создает также совершенно новый объект: это время и память, которые могут быть неудобными если кортеж очень большой. - Первое решение - это доступ к элементам существующего кортежа, доступ к индексу очень быстрый (насколько мне известно) – eyquem
@eyquem для небольших кортежей, индексирование - это все (относительно дорого) Python-вызовы, тогда как итерация, вероятно, включает в себя больше C-кода. (Cue жалоба о преждевременной оптимизации и т. Д.). И если вам действительно очень важно не копировать кортеж, вы можете использовать 'izip' и' islice'. – nneonneo
@nneonneo Индексирование кортежей стоит дорого? Я хотел бы узнать больше – eyquem
Мне нравится recipes from itertools
:
from itertools import izip, tee
def pairwise(iterable):
xs, ys = tee(iterable)
next(ys)
return izip(xs, ys)
print [a * b for a, b in pairwise(range(10))]
Результат:
[0, 2, 6, 12, 20, 30, 42, 56, 72]
tu = (1, 2, 3, 4, 5)
it = iter(tu).next
it()
print tuple(a*it() for a in tu)
Я приурочен различный код:
from random import choice
from time import clock
from itertools import izip
tu = tuple(choice(range(0,87)) for i in xrange(2000))
A,B,C,D = [],[],[],[]
for n in xrange(50):
rentime = 100
te = clock()
for ren in xrange(rentime): # indexing
tuple(tu[x]*tu[x+1] for x in range(len(tu)-1))
A.append(clock()-te)
te = clock()
for ren in xrange(rentime): # zip
tuple(x*y for x,y in zip(tu,tu[1:]))
B.append(clock()-te)
te = clock()
for ren in xrange(rentime): #i ter
it = iter(tu).next
it()
tuple(a*it() for a in tu)
C.append(clock()-te)
te = clock()
for ren in xrange(rentime): # izip
tuple(x*y for x,y in izip(tu,tu[1:]))
D.append(clock()-te)
print 'indexing ',min(A)
print 'zip ',min(B)
print 'iter ',min(C)
print 'izip ',min(D)
результат
indexing 0.135054036197
zip 0.134594201218
iter 0.100380634969
izip 0.0923947037962
izip лучше, чем почтовый индекс: - 31%
Мое решение не так уж плохо (я не думаю, что так, кстати): -25% относительно молнии, 10% больше времени, чем чемпион izip
Я удивлен, что индексация не быстрее, чем почтовый индекс: nneonneo является правильным, застежка-молния является приемлемым
Когда я изменяю 'range' на' xrange' в этой строке 'tuple (tu [x] * tu [x + 1] для x в диапазоне (len (tu) -1))' и увеличивает размер кортежа до 200 000 индексирования В 30% раз быстрее, чем на моей машине. Хотя, izip и iter являются самыми быстрыми и очень близкими. – Akavall
@Akavall @nneonneo О, я был глуп, чтобы позволить '' range''. Вы правы, Akavall, это улучшается. Я сделал то же, что и вы (200 000), и я получил 16 для '' zip'', 13 для '' индексации'' и '' iter'' и 10 для '' izip''. Чем длиннее кортеж, тем хуже '' zip''. Это означает, что конструкция нового объекта '' zip'' тяжела. Тот факт, что '' izip'' остается лучшим, означает, что распаковка не занимает много времени. Однако 10 по сравнению с 13 сейчас составляют всего 23% меньше времени, а не 32 или 35%. – eyquem
- 1. Swap смежные элементы в массиве
- 2. Одновременно умножьте все структурные элементы со скаляром
- 3. Умножьте все элементы в массиве JS
- 4. Умножьте элементы списка списков друг другу
- 5. Как суммировать смежные элементы в scala
- 6. Как считать равные, смежные элементы в векторе?
- 7. ListView - получить смежные элементы щелкнутого элемента
- 8. Удалить смежные повторяющиеся элементы из списка
- 9. Как смежные элементы сводятся к одному элементу
- 10. Ruby/Rails Группы только Смежные элементы массива
- 11. Lodash swap смежные элементы, если условие выполнено
- 12. Эффективно группировать смежные элементы списка в Python
- 13. Ruby count смежные повторяющиеся элементы в массиве
- 14. Как ссылаться на смежные элементы в матрице?
- 15. Получить смежные элементы в двумерном массиве?
- 16. Смежные JButtons
- 17. Смежные переменные
- 18. Excel - SUMIF Смежные строки
- 19. Умножьте элементы на вторичной диагонали массива. Borland C
- 20. Умножьте векторные элементы по вектору для возврата квадратной матрицы
- 21. Умножьте каждый элемент столбца на другие элементы того же столбца
- 22. Умножьте элементы в столбце dataframe на одно значение
- 23. Умножьте элементы внутренних списков в качестве понимания списка
- 24. Умножьте элементы из одного списка с элементами из другого списка
- 25. Динамически добавлять классы в смежные элементы на mouseenter
- 26. Нужен лучший способ заставить функцию воздействовать на смежные элементы списка
- 27. Есть ли еще Pythonic способ условно объединить смежные элементы списка?
- 28. CSS смежные селекторные ролики, Safari и <nav> элементы
- 29. Выберите все смежные элементы без копирования массива numpy
- 30. Смежные элементы встроенного блока смещаются при добавлении текста. (HTML/CSS)
+1 Я знал, что что-то пропустил! – Volatility
@nneonneo @Paul Manta Не очень хорошо. '' t [1:] '' создает новый объект, '' zip (t, t [1:]) '' создает один объект больше, а '' для x, y в zip (t, t [1: ]) '' требуется распаковать каждый элемент заархивированного объекта на два идентификатора '' x'' и '' y'' – eyquem
Если это имеет значение для вас, используйте 'izip' и' islice'. Распаковка в колодках дешевая, и избежать ее просто для экономии нескольких микросекунд не стоит. – nneonneo