условное приращение элемента списка python - PullRequest
3 голосов
/ 18 ноября 2010

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

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

Я думаю, что поэлементный оператор, такой как ~ + = from 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]

и s, p оба массива.

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

Ответы [ 4 ]

2 голосов
/ 18 ноября 2010

Вот быстрая версия:

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

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

1 голос
/ 18 ноября 2010

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

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

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

В основном, что-то вроде:

[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:

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

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

0 голосов
/ 18 ноября 2010
s = [s[i]+p[i]*(s[i]<s[0]) for i in range(1,len(s))]
...