2017-04-12 39 views
0

對於兩個列表欲級聯列表和刪除重疊

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

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

如果我指定的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 

做它的字符串列表,但應該是同樣的事情。

編輯:

我想我的代碼做的是,首先,檢查是否有任何重疊(1,2,等等),然後串聯列表,消除重疊什麼(所以不獲得雙元素)。

[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

這裏的一個變體幼稚:

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:] 

這將是與由參考支持切片類型,例如緩衝劑或numpy的陣列更有效。

這樣做的一件很奇怪的事情是,當達到重疊= 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而非二者

    新名單僅數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] 
    

只是爲了好玩,一個班輪可以給這樣的:

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

哪裏OVERLAP是你需要你重逢不變。

+0

我剛剛意識到,也許我是脫離主題,你能否確切地說明我的答案以何種方式幫助你? thx @Qubix –