2013-07-08 30 views
5

Tôi muốn thêm hai danh sách bắt đầu chiều dài khác nhau từ cánh phải Dưới đây là một ví dụThêm hai danh sách có độ dài khác nhau trong python, bắt đầu từ bên phải

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

Kết quả mong đợi:

[3, 0, 10, 8] 

Danh sách này thể hiện hệ số đa thức

Đây là triển khai của tôi

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 

Điều này làm việc tốt, chỉ muốn biết dù sao để làm tốt hơn, mã sạch hơn? Như python luôn luôn nhấn mạnh ở mã sạch, tôi muốn biết là có cách nào để viết sạch hơn, mã pythonic?

+0

@Haidro: Tôi không nghĩ vậy. Tôi đã cố làm sáng tỏ ví dụ. Timothy, nếu làm rõ điều đó sai, hãy sửa nó. –

+1

@TimPietzcker Tôi thấy, nhưng không phải là 7 + 1 9? Hoặc là nó 8 + 1 nhưng sau đó 7 + 2! = 10 – TerryA

+0

@ Haidro: Rất tiếc :) –

Trả lời

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] 

Rõ ràng, nếu bạn chọn một quy ước mà các hệ số được sắp xếp theo cách ngược lại, bạn có thể chỉ cần sử dụng

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

Tôi phải nói rằng để nhất quán, nó sẽ đẹp hơn khi người dùng đảo ngược cho lần đảo ngược cuối cùng, thay vì [:: - 1]. –

+1

@LennartRegebro, tôi đồng ý, nhưng điều đó sẽ trả lại một 'listreverseiter': ( –

+0

Vâng, đúng là có thể anh ta sẽ cắt nó sau đó. –

2

Tôi tin rằng một đơn giản cho vòng lặp là đơn giản hơn nhiều so với một sự hiểu biết với 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) 

Nếu bạn cần giữ P không đổi, hãy sao chép trước. Ngoài ra, nếu Q nhỏ hơn nhiều so với P, điều này sẽ hiệu quả hơn.

+0

@gnibbler Tôi đã thêm kiểm tra ... Ngoài ra, điều này sẽ lặp lại kích thước của mã nhỏ nhất – JBernardo

0

Bạn có thể sử dụng 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

Trong khi mã này có thể trả lời câu hỏi, cung cấp thêm ngữ cảnh về cách thức và/hoặc lý do giải thích –

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

Trong khi mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về cách thức và/hoặc lý do giải quyết vấn đề này sẽ cải thiện giá trị lâu dài của câu trả lời. –