2017-04-12 5 views
0

に重なるを連結リスト及び削除は、私がしたい二つのリストについて

A = [ 1,2,3,4,5] 
B = [4,5,6,7] 

結果C = [1,2,3,4,5,6,7]

I 2のオーバーラップを指定した場合。これまで

コード:

concat_list = [] 
word_overlap = 2 

for lst in [lst1, lst2, lst3]: 
    if (len(concat_list) != 0): 

    if (concat_list[-word_overlap:] != lst[:word_overlap]): 
     concat_list += lst 
    elif ([concat_list[-word_overlap:]] == lst[:word_overlap]): 

     raise SystemExit 

    else: 
    concat_list += lst 

は、文字列のリストのためにそれをやってますが、同じものでなければなりません。

編集:私は私のコードが何をしたいのか

が任意の重複がある場合は、最初、(2の1のは、など、)を確認、で、その後、重複を排除し、リストを連結(ので、私はしないでくださいdouble要素を得る)。

[1,2,3,4,5] + [4,5,6,7] = [1,2,3,4,5,6,7]

しかし

[1,2,3] + [4,5,6] = [1,2,3,4,5,6]

私の設定したword_overlapよりも小さいオーバーラップもチェックしたいと思います。私が正しくあなたの質問を解釈していますが、このようにそれを行うことができれば

+2

'LST1 = [1,2,3,4,5]' ' LST2 = [4,5,6,7]' 'C:我々は、わずかな書き換えと特異的にこのケースを扱うことができます= lst1 + lst2' 'print list(set(c))'リストを連結する簡単な方法 –

答えて

1

ここナイーブバリアントです。

これは、オーバーラップ= 0に達すると、aの全体(リストのコピーであるスライス)とbの空のスライスとを比較します。空でない限り、比較は失敗しますが、オーバーラップ= 0のままなので、戻り値は正しいです。

def concat_nooverlap(a,b): 
    maxoverlap=min(len(a),len(b)) 
    for overlap in range(maxoverlap,0,-1): 
     # Check for longest possible overlap first 
     if a[-overlap:]==b[:overlap]: 
      return a+b[overlap:] 
    else: 
     return a+b 
0

わからない:

A = [ 1,2,3,4,5] 
B = [4,5,6,7] 

overlap = 2 

print A[0:-overlap] + B 

あなたは、彼らが同じ値を持っていることを確認したい場合は、あなたのチェックはの線に沿って考えられます。

if(A[-overlap:] == B[:overlap]): 
    print A[0:-overlap] + B 
else: 
    print "error" 
0

両方のリストが連続していると仮定し、リストaは常にリストbより小さい値を持ちます。私はこの解決策を考え出す。 これは重複の検出にも役立ちます。

def concatenate_list(a,b): 
    max_a = a[len(a)-1] 
    min_b = b[0] 
    if max_a >= min_b: 
     print 'overlap exists' 
     b = b[(max_a - min_b) + 1:] 
    else: 
     print 'no overlap' 
    return a + b 

文字列の場合、あなたはまた、

def concatenate_list_strings(a,b): 
    count = 0 
    for i in xrange(min(len(a),len(b))): 
     max_a = a[len(a) - 1 - count:] 
     min_b = b[0:count+1] 

     if max_a == min_b: 
      b = b[count +1:] 
      return 'overlap count ' + str(count), a+b 
     count += 1 
    return a + b 
+0

文字列のリストに対してもこの作業を行えますか? – Qubix

+0

上記と同じ概念と前提条件を使用して文字列を連結しますか? – Siddhant

+0

文字列のリスト – Qubix

1

あなたがsetと組合を使用することができ、これを行うことができ

s.union(T):両方sとt

からの要素を持つ新しいセット
>> list(set(A) | set(B)) 
[1, 2, 3, 4, 5, 6, 7] 

しかし、このように重複する必要がある正確な数値を持つことはできません。

あなたが質問に答えるために、あなたがセットの組み合わせを策略して使用する必要がありますが:

  • AとB
  • の両方の要素を持つ新しいリストを取得するAに共通の要素で新しいリストを取得し、 B
  • あなたは

  • をスライス使用して、このリストに必要な要素の数だけがAまたはBのいずれかの要素で新しいリストを取得ではなく、両方

    取得します10
    OVERLAP = 1 
    
    A = [1, 2, 3, 4, 5] 
    B = [4, 5, 6, 7] 
    
    C = list(set(A) | set(B)) # [1, 2, 3, 4, 5, 6, 7] 
    D = list(set(A) & set(B)) # [4, 5] 
    D = D[OVERLAP:] # [5] 
    
    
    print list(set(C)^set(D)) # [1, 2, 3, 4, 6, 7] 
    

楽しみのためだけに、ワンライナーは、この与えることができる:OVERLAPはあなたが再会必要一定である

list((set(A) | set(B))^set(list(set(A) & set(B))[OVERLAP:])) # [1, 2, 3, 4, 6, 7] 

を。そのような緩衝液またはnumpyのアレイとして参照によりスライスをサポートするタイプと、より効率的であろう

def concat_nooverlap(a,b): 
    maxoverlap=min(len(a),len(b)) 
    for overlap in range(maxoverlap,-1,-1): 
     # Check for longest possible overlap first 
     if a[-overlap:]==b[:overlap]: 
      break # Found an overlap, don't check any shorter 
    return a+b[overlap:] 

+0

私はちょうど私がオフトピックだったかもしれないことに気づいた、私の答えがどんな方法であなたを助けてくれるか正確にできますか? thx @Qubix –

関連する問題