2015-04-08 19 views
7

Aşağıdaki kod geçerli durumunda çalışmaz. Ancak, sum_vec.extend(vec1[i] + vec2[i])'u sum_vec.append(vec1[i] + vec2[i]) olarak değiştirirseniz, gayet iyi çalışır. Ekleme ve genişletme arasındaki temel farkı anlıyorum, ancak uzamı kullanırsam kodun neden çalışmadığını anlamıyorum.Python: Ekleme ve genişletme arasındaki farkı anlama

def addVectors(v1, v2): 

    vec1 = list(v1) 
    vec2 = list(v2) 
    sum_vec = [] 
    vec1_len = len(vec1) 
    vec2_len = len(vec2) 
    min_len = min(vec1_len, vec2_len) 

    # adding up elements pointwise 
    if vec1_len == 0 and vec2_len == 0: 
     return sum_vec 
    else: 
     for i in xrange(0, min_len): 
      sum_vec.extend(vec1[i] + vec2[i]) 

    # in case one vector is longer than the other 
    if vec1_len != vec2_len: 
     if vec1_len > vec2_len: 
      sum_vec.extend(vec1[min_len : vec1_len]) 
     else: 
      sum_vec.extend(vec2[min_len : vec2_len]) 
    print sum_vec 
    return sum_vec 

v1 = [1,3,5] 
v2 = [2,4,6,8,10] 
addVectors(v1,v2) 
+0

iki operasyonlar sonrasında 'sum_vec' sürümleri arasındaki farkı baktınız mı? Tam olarak ne "* çalışmıyor" * ortalama - hatalar? Beklenmeyen çıktılar? – jonrsharpe

cevap

17

, extend, (örneğin, bir liste, başlığın ya da tel gibi) bir iterable alır, ve her seferinde bir listeye iterable her eleman ekler listenin sonu tek bir öğe olarak. Dikkat edilmesi gereken en önemli nokta, extend'un append'u birden çok kez çağırmanın daha etkili bir sürümüdür.

a = [1,2] 
b = [1,2] 

a.extend([3, 4]) 
for x in [3, 4]: 
    b.append(x) 

assert a == b 

append onun argüman olarak bir iterable alabilir, ancak tek bir nesne gibi davranır:

a = [1,2] 
a.append([3,4]) 
assert a == [1, 2, [3, 4]] # not [1, 2, 3, 4] 
+0

Neden python bir dizeyi "a.extend (str)" yi kullanırken liste olarak ele alır? – Jean

+1

Bunu bir liste olarak ele almaz; Bu, yineleyebileceğiniz bir şey olan * yinelenebilir * olarak değerlendirir. Tek tek karakterlerini tek tek elde ederek bir dizgeyi tekrarlarsınız. Öğelerini birer birer alarak bir liste veya bir tuple yineleyin. Anahtarlarını tek tek alarak bir dict üzerinde yineleyin. "Uzatmak" umurumda değil * argümanı, tekrarlanabildiği sürece. – chepner

5

Sen list üzerinde belgeleri okuyabilir:

list.append listenizin sonuna tek bir öğe ekler:

Listenin sonuna bir eleman ekler; [len (a):] = [x] değerine eşittir.

verilen listedeki tüm öğeleri ekleyerek listeyi uzatın;:

list.extend bir iterable kullanır ve listenin sonuna 's tüm öğeleri ekler Bir eşdeğer [len (a)]:

sum_vec.extend([vec1[i] + vec2[i]]) # note that a list is created 

bu şekilde geçirilir tek bir madde (vec1[i] + vec2[i]) ile bir iterable = L

için kullanmak gerekir. Her zaman tek bir öğe eklediğinizde list.append daha uygundur. Kodunuzu çalıştırdığınızda

5

, bir İstisna bu hale: Başka bir deyişle

Traceback (most recent call last): 
    File ".../stack.py", line 28, in <module> 
    addVectors(v1,v2) 
    File ".../stack.py", line 15, in addVectors 
    sum_vec.extend(vec1[i] + vec2[i]) 
TypeError: 'int' object is not iterable 

, extend yöntem argüman olarak bir iterable beklemektedir. Ancak, ekleme yöntemi bir öğeyi argüman olarak alır. İşte

arasındaki farkın küçük bir örneğidir uzatmak ve ekleyin:

l = [1, 2, 3, 4] 
m = [10, 11] 
r = list(m) 
m.append(l) 
r.extend(l) 

print(m) 
print(r) 

Çıktı: Tek listeyi uzatmak istiyorsanız

[10, 11, [1, 2, 3, 4]] 
[10, 11, 1, 2, 3, 4] 
1

bir parametre olarak yeterli yeri bir iterable uzatmak Giyinmeniz gereken öğe bir listede bulunmaktadır.

a = [] 
b = 1 

a.extend([b]) 
a.append(b) 
2

genişletme listesi bir liste alır ve içeriğine ekler iken, parametresini listeye tek bir öğe olarak ekler. append bağımsız değişkeni ekler, diğerleri işaret gibi

letters = ['a', 'b'] 

letters.extend(['c', 'd']) 
print(letters) # ['a', 'b', 'c', 'd'] 

letters.append(['e', 'f']) 
print(letters) # ['a', 'b', 'c', 'd', ['e', 'f']] 

names = ['Foo', 'Bar'] 
names.append('Baz') 
print(names) # ['Foo', 'Bar', 'Baz'] 

names.extend('Moo') 
print(names) # ['Foo', 'Bar', 'Baz', 'M', 'o', 'o'] 
İlgili konular