2013-07-08 6 views
5

voglio aggiungere due elenco di diversi inizio lunghezza dalla destra Ecco un esempioAggiungere due elenchi di diverse lunghezze in python, a partire da destra

[3, 0, 2, 1] 
[8, 7] 

Risultato atteso:

[3, 0, 10, 8] 

Questa lista rappresenta il coefficiente di polinomi

Ecco la mia implementazione

class Polynomial: 
    def __init__(self, coefficients): 
     self.coeffs = coefficients 

    def coeff(self, i): 
     return self.coeffs[-(i+1)] 

    def add(self, other): 
     p1 = len(self.coeffs) 
     p2 = len(other.coeffs) 
     diff = abs(p1 - p2) 
     if p1 > p2: 
      newV = [sum(i) for i in zip(self.coeffs, [0]*diff+other.coeffs)] 
     else: 
      newV = [sum(i) for i in zip([0]*diff+self.coeffs, other.coeffs)]     
     return Polynomial(newV) 

    def __add__(self, other): 
     return self.add(other).coeffs 

Questo lavoro va bene, voglio solo sapere in ogni caso di fare meglio, codice più pulito? Come pitone ha sempre sottolineato al codice pulito, voglio sapere c'è un modo per scrivere un codice più pulito e pitonioso?

+0

@Haidro: Io non la penso così. Ho cercato di chiarire l'esempio. Timothy, se questo chiarimento è sbagliato, correggilo. –

+1

@TimPietzcker Vedo, ma non è 7 + 1 9? O è 8 + 1 ma poi 7 + 2! = 10 – TerryA

+0

@Haidro: Oops :) –

risposta

13
>>> P = [3, 0, 2, 1] 
>>> Q = [8, 7] 
>>> from itertools import izip_longest 
>>> [x+y for x,y in izip_longest(reversed(P), reversed(Q), fillvalue=0)][::-1] 
[3, 0, 10, 8] 

Ovviamente, se si sceglie una convenzione in cui i coefficienti sono ordinate in senso opposto, si può semplicemente utilizzare

P = [1, 2, 0, 3] 
Q = [7, 8] 
[x+y for x,y in izip_longest(P, Q, fillvalue=0)] 
+0

Devo dire che per coerenza sarebbe più bello per l'utente invertito per l'ultima reversione, invece di [:: - 1]. –

+1

@LennartRegebro, sono d'accordo, ma restituirebbe 'listreverseiterator' :( –

+0

Beh, è ​​vero che forse lo avrebbe tagliato in seguito. –

2

Credo che un semplice ciclo for è di gran lunga più semplice di una comprensione con zip_longest .. .

P = [3, 0, 2, 1] 
Q = [8, 7] 

A, B = sorted([P, Q], key=len) 

for i, x in enumerate(reversed(A), 1): 
    B[-i] += x 

#print(B) 

Se è necessario mantenere invariato P, copiarlo prima. Inoltre, se Q è molto più piccolo di P, questo sarà più efficace.

+0

@gnibbler Ho aggiunto il controllo ... Inoltre, questo itererà solo la dimensione del più piccolo – JBernardo

0

È possibile utilizzare numpy:

>>> import numpy as np 
>>> L1 = [3, 0, 2, 1] 
>>> L2 = [8, 7] 
>>> L2 = [0 for i in range(len(L1)-len(L2))] + L2 
>>> A1 = np.array(L1) 
>>> A2 = np.array(L2) 
>>> A1+A2 
array([ 3, 0, 10, 8]) 
0
a = [0, 1, 3, 4] 

b = [5, 6] 

iter_len = len(a)-(len(b) - 1) 

for j in range(len(a), 0, -1): 

     if j-iter_len < 0: 
      break 
     else: 
      a[j-1] = a[j-1] + b[j-iter_len] 
print a 
+0

Mentre questo codice può rispondere alla domanda, fornendo un ulteriore contesto riguardo a come e/o perché risolve il problema migliorerebbe il valore a lungo termine della risposta –

0
a = [1,2,3,4,5,6,7,8,9,10,5,7,9] 

b = [1,2,5] 

n = a 

addStart = len(a) - len(b) 

count = 0 

for i in b : 

    n[addStart+count] = i + a[addStart+count] 
    count+=1 
print n 
+1

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e/o perché risolve il problema migliorerebbe il valore a lungo termine della risposta. –