2016-11-21 7 views
1

長さを考慮しながら2つのリストを一緒に追加する必要がある質問に悩まされています。たとえば、list1 = [1,2]list2 = [3,4,5]の場合、回答は[1+3,2+4,5]または[4,6,5]となります。長さをチェックしている間に2つのリストを追加する

は、私がこれまで持っていることは次のとおりです。

def addsum(list1,list2): 
    new_list = [] 
    if len(list1) > len(list2): 
     new_list = list1[0:]+list2[0:] 

私はリストへの新たなんだので、この質問をappraochするかどうかは本当にわかりません。助けていただければ幸いです!

答えて

0

貧乏人のアプローチ:

def addsum(list1,list2): 
    if len(list1) >= len(list2): 
     for i in range(len(list2)): 
      list1[i]=list1[i]+list2[i] 
     return list1 
    else: 
     for i in range(len(list1)): 
      list2[i]=list1[i]+list2[i] 
     return list2 
2

あなたはリスト内包で0fillvalueとitertoolsからzip_longestを使用する必要があります。

r = [sum(i) for i in zip_longest(list1, list2, fillvalue=0)] 

zip_longestペア入力リスト内の要素(list1list2ここに)。 1つのリストが小さい場合は、大きいリストの残りの要素をfillvalue(ここでは0に割り当てます)として指定された値とペアにします。

は今、rは等しい:

print(r) # [4, 6, 5] 

を同様に、あなたの代わりに、リスト-COMPのmapを利用することができる:

# Python 3.x 
r = list(map(sum, zip_longest(list1, list2, fillvalue=0))) 
# Python 2.7 
r = map(sum, zip_longest(list1, list2, fillvalue=0)) 

をしてrため、同じ結果を得ることができます。

0

私もzip_longestソリューションを使用しますが、あなたのコード内の建物が、これは私が最初の最初のリストが最長であることを確認し、それが当てはまらない場合は、それらを交換

def addsum(list1, list2): 
    if len(list1) < len(list2): 
     list1, list2 = list2, list1 
    result=list(list1) 
    for i,x in enumerate(list2): 
     result[i] += x 
    return result 

を何をするのかであります、(最も長いリストのコピーを作成し、最終的にzip_longestがよりきちんとしているが、別の可能性はトライアル/エラーのアプローチを使用することですコピーに短いリスト位置ごとの要素を追加し、

>>> addsum([1,2],[3,4,5]) 
[4, 6, 5] 
>>> 
0

それを返しますあなたが "ifs"に疲れているなら、 )、ここに示すように:zip_longest

def addsum(list1, list2): 
    res = [] 
    i = 0 
    while i < len(list1) or i < len(list2): 
     try: 
      res.append(list1[i]+list2[i]) 
     except IndexError: 
      try: res.append(list1[i]) 
      except IndexError: res.append(list2[i]) 
     i += 1 
    return res 
0

ドキュメント:

各iterableの要素をまとめるイテレータを作成します。イテラブルの長さが不揃いである場合、欠損値はfillvalueとなります。反復は、最長の反復可能性がなくなるまで続きます。

from itertools import zip_longest 
[x + y for x, y in zip_longest([1,2], [3,4,5], fillvalue=0)] 

出力:

[4, 6, 5] 
ここ

コードです

関連する問題