2013-07-08 15 views
5

gelen, Python, iki farklı uzunlukta listeleri ekleyin başlatmak Bir örnekBen burada sağ farklı uzunluk başlamasından sonraki iki listeyi eklemek istediğiniz doğru

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

Beklenen sonuç var Bu liste polinomların katsayılarını temsil eder

İşte benim uygulamam

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 

Bu iyi bir iş, sadece daha iyi, daha temiz kod yapmak için bilmek ister misiniz? Python her zaman temiz kodda vurgulandığı gibi, temiz, pythonik kod yazmanın herhangi bir yolu olduğunu bilmek ister misiniz? Eğer katsayıları ters bir şekilde sıralanır bir kongre seçerseniz

+0

@Haidro: Ben öyle düşünmüyorum. Örneği açıklığa kavuşturmaya çalıştım. Timothy, bu açıklama yanlışsa, lütfen düzeltin. –

+1

@TimPietzcker Görüyorum, ama 7 + 1 9 değil mi? Ya da 8 + 1 ama sonra 7 + 2! = 10 – TerryA

+0

@Haidro: Oops :) –

cevap

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] 

Açıkçası, sadece ben döngü için basit zip_longest bir anlama çok daha basittir inanıyoruz

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

Ben tutarlılık için [:: - 1] yerine son reversiyon için tersine kullanıcı için daha iyi olacağını söylemek zorundayım. –

+1

@LennartRegebro, Katılıyorum, ancak bu bir 'listreverseiterator' döndürecektir :( –

+0

Evet, belki de daha sonra dilimleyeceği doğrudur. –

2

kullanabilirsiniz .. .

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) 

sen değişmeden P tutmak gerekiyorsa

, ilk kopyalayın. Ayrıca, Q, P'dan daha küçükse, bu daha etkili olacaktır.

+0

@gnibbler Ben kontrol ekledim ... Ayrıca, bu sadece küçük bir – JBernardo

0

Sen numpy kullanabilirsiniz:

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

boyutunu yineleyecek Bu kod soruya cevap verebilirken, nasıl ve/veya neden çözdüğüyle ilgili ek bağlam sağlayarak Sorun, sorunun uzun vadedeki değerini artıracaktır –

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

Bu kod soruyu cevaplayabilirken, sorunun nasıl ve/veya neden çözüldüğüne dair ek bağlam sağlayarak yanıtın uzun vadeli değerini artıracaktır. –

İlgili konular