2010-11-18 20 views
3

J'ai cherché pendant un certain temps, au fond, je suis en train d'incrémenter conditionnellement une liste d'éléments par une autre liste, élément par élément ...élément de la liste python incrément sage conditionnel

mon code suit, mais est il y a une meilleure façon de le faire? liste de compréhension, carte ??

Je pense qu'un opérateur par élément comme ~ + = de http://www.python.org/dev/peps/pep-0225/ serait vraiment bon, mais pourquoi est-il différé?

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

basé sur quelques bons retours de vous les gars je recodé à ce qui suit

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

et s, p sont les deux tableaux.

p.s encore plus lent que matlab 5 fois pour l'un de mes codes.

Répondre

1

Si vous ne voulez pas créer un nouveau tableau, vos options sont:

  1. Qu'est-ce que vous proposez (bien que vous pouvez utiliser xrange selon la version python
  2. Utilisez des tableaux Numpy pour s et p. Ensuite, vous pouvez faire quelque chose comme s[s<s[0]] += p[s<s[0]] si s et p ont la même longueur.
  3. Utilisez Cython pour accélérer ce que vous avez proposé.
+0

Salut, justin, juste essayé numpy, fonctionne bien, le code peut être écrit comme i = s

+0

@jerry, oui, vous pouvez le faire (et devrait si s est très grand). –

1

Cochez cette question SO:

En gros, quelque chose comme:

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

Exemple:

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

Pour clar ifier, voici ce que zip ne:

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

Il Assemble deux (ou plus) des listes dans une liste de tuples. Vous pouvez tester les conditions sur les éléments de chacun des tuples.

+0

Je sais zip, mais le problème est la génération d'une nouvelle liste de déchets de la mémoire de l'ancienne liste. –

+0

également pour la condition pas vrai, vous obtenez une liste plus petite et perdez la position relative de l'élément. –

+0

@jerry Vous avez raison sur les deux points, j'ai mal lu la ligne où vous avez fait l'addition. Compte tenu de cela, je ne pense pas qu'il existe une meilleure solution que ce que vous avez proposé. –

2

Voici une version rapide:

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

Cela suppose que len(s) <= len(p)

Hope this helps. Faites-moi savoir. Bonne chance. :-)

+0

@jerry Ai-je répondu à votre question? – nonot1

+0

@jerry Pure Python ne sera jamais aussi rapide que Matlab. Principalement en raison de la typographie dynamique OO. Si vous avez besoin de vitesse, vous aurez besoin d'un module python conçu pour les tableaux. Jetez un oeil à: http://numpy.scipy.org/ – nonot1

+0

@jerry Si j'ai répondu à votre question, s'il vous plaît marquer comme "répondu" et faites le moi savoir. Je vous remercie. :-) – nonot1

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