2010-11-18 3 views
3

Я искал это на некоторое время, в основном я пытаюсь условно увеличиваем список элементов другого списка, поэлементно ...питона список поэлементно условный прирост

мой код следующий, но есть лучший способ сделать это? список, карта?

Я думаю, что элемент-мудрый оператор, например ~ + = от http://www.python.org/dev/peps/pep-0225/, был бы очень хорош, но почему он отложен?

for i in range(1,len(s)): 
     if s[i]<s[0]: 
      s[i]+=p[i] 

на основе хороших отзывов от вас, ребята, я перекодироваться к следующему

i=s<s[0] 
s[i]+=p[i] 

и с, р являются массивы.

p.s все еще медленнее, чем Matlab 5 раз для одного из моих кодов.

ответ

1

Если вы не хотите, чтобы создать новый массив, то ваши варианты:

  1. Что вы предложили (хотя вы можете использовать xrange в зависимости от версии питона)
  2. Используйте массивы Numpy для s и p. Тогда вы можете сделать что-то вроде s[s<s[0]] += p[s<s[0]], если s и p имеют одинаковую длину.
  3. Используйте Cython, чтобы ускорить то, что вы предложили.
+0

привет, justin, просто попробовал numpy, хорошо работает, код может быть записан как i = s

+0

@jerry, да, вы можете это сделать (и должен, если s очень большой). –

1

Проверьте этот SO вопрос:

В принципе, что-то вроде:

[sum(a) for a in zip(*[s, p]) if a[0] < 0] 

Пример:

>>> [sum(a) for a in zip(*[[1, 2, 3], [10, 20, 30]]) if a[0] > 2] 
[33] 

Для ЦАЗР римента, вот что делает почтовый индекс:

>>> zip(*[[1, 2, 3], [4, 5, 6]]) 
[(1, 4), (2, 5), (3, 6)] 

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

+0

Я знаю, zip, но проблема в создании нового списка отходов старой памяти. –

+0

также для условия не верно, вы получаете меньший список и теряете относительное положение элемента. –

+0

@jerry. Вы правы в обоих пунктах, я неправильно читаю строку, где вы добавили. Учитывая это, я не думаю, что есть лучшее решение, чем то, что вы предложили. –

2

Вот быстрый вариант:

# sample data 
s = [10, 5, 20] 
p = [2,2,2] 

# As a one-liner. (You could factor out the lambda) 
s = map(lambda (si, pi): si + pi if si < s[0] else si, zip(s,p)) 

# s is now [10, 7, 20] 

Это предполагает, что len(s) <= len(p)

Надеюсь, что это помогает. Дайте мне знать. Удачи. :-)

+0

@jerry Я ответил на ваш вопрос? – nonot1

+0

@jerry Pure Python никогда не будет так быстро, как Matlab. Главным образом из-за динамического ввода OO. Если вам нужна скорость, вам понадобится модуль python, предназначенный для массивов. Посмотрите: http://numpy.scipy.org/ – nonot1

+0

@jerry Если я ответил на ваш вопрос, отметьте как «ответили» и дайте мне знать. Спасибо. :-) – nonot1

0
s = [s[i]+p[i]*(s[i]<s[0]) for i in range(1,len(s))] 
Смежные вопросы