2017-11-20 4 views
1

リストの1つの指定されたインデックスから複数のリストを結合し、それぞれのインデックスの値を合計するにはどうすればよいですか?関数を使用して指定されたインデックスから始まる異なる長さのPythonの合計リスト

私は3つのリストを持っていた場合:

a = [1, 2, 3, 4, 5, 0, 0, 0, 0] 
b = [2, 3, 4, 5, 6] 
c = [5, 2] 

私はa内の任意の位置にリストbcを挿入することができ、それぞれのインデックスが合計なるように、私はそれを作ることができる方法は?

たとえば、aの最初のインデックスからリストbを挿入し、aの5番目のインデックスからリストcを挿入することもできます。あなたがaの前述のインデックスでリストbcを追加するとき、私はやりたい第五インデックス、の重複があったことがわかります

NewList = [1, 4, 6, 8, 10, *11*, 2, 0, 0] 

:これの出力は次のようになります。

Iは、スライス方式と組み合わせてitertoolsからizip_longestを用いて試みた:

result = [sum(n) for n in izip_longest(a[2:], b, fillvalue=0)] 

しかし、これは生成:

result = [5, 7, 9, 5, 6, 0, 0] 

これはリストaで0と1のインデックスを、オフ切断するIほしくない。しかし、異なる長さのリストを合計することができるので、izip_longestを使用します。

aはlen = 1000のリストにすることができ、aに任意の長さの異なるリストを挿入することができます何度も私が望むようにインデックス値が合計されます。ここで

+0

編集提案に記載されているとおりです。 '[b]'は 'b'と同じではありません。これら2つを混同しないでください。 –

+0

あなたの質問を簡略化することをお勧めします。私は一度だけそれを読むことを認めますが、あなたのポイントが何かを理解することは難しいです。 –

+0

なぜ最初に行単位で処理しないのですか?完成まで(リストの理解に)時間がかかります(https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions)。私はこれがリストの理解を使って簡単に(または可能である)とは思わない。言い換えれば、**これには1行の解決策はありません**。 –

答えて

1

はあなたが求めている何をすべき機能です:

def combine(lista, listb, index_in_list_a_to_start_insert): 
    # left pad list b with zeros 
    newb = [0]*index_in_list_a_to_start_insert + listb 

    # right pad shorter list 
    max_len = max(len(lista), len(newb)) 
    newa = lista if len(lista) >= max_len else lista + [0]*(max_len-len(lista)) 
    newb = newb if len(newb) >= max_len else newb + [0]*(max_len-len(newb)) 

    # sum element-wise    
    return [a + b for a, b in zip(newa,newb)] 

あなたはとてもとして、この関数を連鎖して、例を実行することができます。

a = [1, 2, 3, 4, 5, 0, 0, 0, 0] 
b = [2, 3, 4, 5, 6] 
c = [5, 2] 
combine(combine(a, b, 1), c, 5) 

出力:

[1, 4, 6, 8, 10, 11, 2, 0, 0] 

エラーチェックを追加して、指定されたインデックスが範囲内にあることを確認することもできます。

+0

元のリストのサイズを維持する方法を知っていますか?たとえば、結合関数を使用してインデックス6のリストaにbを追加した場合、aとbを加算した出力は[1,2,3,4,5,0,2,3,4]となります。したがって、len(a)は関数の前後で同じ値を持ちます。 –

+0

短いリストを右にパディングするのではなく、 'newb'を' a'よりも長くならないように切り詰めます。 – pault

+0

また、最後に切り捨てることもできます: 'newlist = combine(a、b、6)[0:len(a)]' – pault

関連する問題