2017-09-26 17 views
1

特定の条件が満たされている場合、2つのリストをリストのリスト内でマージしようとしています。特定の条件が満たされている場合、2つのリストをリストとマージする

例:

li = [[18, 19, 20, 21, 22], [25, 26, 27], [59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69]] 

li2 = [[15, 16, 17], [32, 33, 34, 35], [89, 90, 91], [95, 96, 97, 98]] 

条件は各リスト間の差(またはむしろ距離)が7個の未満単位である場合、リストはマージされることです。リストがマージされた後、不足している数字を記入したいと思います。

そこで期待される成果は以下の通りです:

li = [[18, 19, 20, 21, 22, 23, 24, 25, 26, 27], [59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69]] 

li2 = [[15, 16, 17], [32, 33, 34, 35], [89, 90, 91, 92, 93, 94, 95, 96, 97, 98]] 

これは私が働いている現在のコードです:

new_li = [] 
for i in np.arange(len(li) - 1): 
    current_item, next_item = li[i], li[i+1] 

    if next_item[0] - current_item[-1] <= 7: 
     new_li.append(current_item + next_item) 

    else: 
     new_li.append(next_item) 

私に与える:

new_li = [[18, 19, 20, 21, 22, 25, 26, 27], [59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69]] 

アプリli2のコードを横たわっ:

new_li2 = [[32, 33, 34, 35], [89, 90, 91], [89, 90, 91, 92, 93, 95, 96, 97, 98]] 

私も欠損値を埋めるために開始する前に、自分のコードが間違っていると正しいコードの最後の部分を得るように見えることはできません。私のコードを改善するための助けやヒントがあれば幸いです!

+0

を次のようにこのようにあなたは解決策を書き換えることができますか? 'range'は速くなり、あなたはNumPyを依存関係として必要としません。 – MSeifert

答えて

0

すでに追加されている場合は、次のリストをスキップする必要があります。また、現在のセットが次のセットの条件を満たさない場合は、次のセットではなく結果セットに現在のセットを追加する必要があります。次のコード

が修正されています。あなたは簡単に(完全なリストを作成することなく)ループ内でそれらを使用して変換することができますので、

li = [[18, 19, 20, 21, 22], [25, 26, 27], [59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69]] 
li2 = [[15, 16, 17], [32, 33, 34, 35], [89, 90, 91], [95, 96, 97, 98]] 

new_li = [] 
for i in range(len(li2) - 1): 
    current_item, next_item = li2[i], li2[i+1] 

    if next_item[0] - current_item[-1] <= 7: 
     new_li.append(current_item + next_item) 
     i+=1 
    else: 
     new_li.append(current_item) 


for item in new_li: 
    print (item) 
0

は、私は、タスクのこの種のために(たとえば"What does the “yield” keyword do?"を参照)発電機の機能を好みます必要に応じてリストに追加することができます。

基本的にこれが要件を満たしています:

def merge(li): 
    current = None 
    for sublist in li: 
     if current is None: 
      # First iteration, just set the "current" then process the next sublist. 
      current = sublist 
      continue 
     if sublist[0] - current[-1] <= 7: 
      # first append the missing values 
      current.extend(range(current[-1] + 1, sublist[0])) 
      # then append the next sublist 
      current.extend(sublist) 
     else: 
      # Difference is greater than 7 yield the current list and then reset it. 
      yield current 
      current = sublist 
    # Exhausted, yield the last current then exit. 
    yield current 

これは(それがジェネレータ関数の呼び出しの周りlist()が必要であることに注意してください)あなたの例のための期待される結果が得られます。

>>> list(merge([[18, 19, 20, 21, 22], [25, 26, 27], [59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69]])) 
[[18, 19, 20, 21, 22, 23, 24, 25, 26, 27], [59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69]] 

>>> list(merge([[15, 16, 17], [32, 33, 34, 35], [89, 90, 91], [95, 96, 97, 98]])) 
[[15, 16, 17], [32, 33, 34, 35], [89, 90, 91, 92, 93, 94, 95, 96, 97, 98]] 

それは可能性もいくつかのサブリストをマージしてください。これはあなたのケースで問題になります:

>>> list(merge([[1,2], [5, 6], [10,11], [200])) 
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], [200]] 
0
def merge(li): 
    return [li[i] + range(max(li[i]) + 1, min(li[i+1])) + li[i+1] 
      if min(li[i+1]) - max(li[i])<7 
      else li[i] for i in range(len(li)-1)] 

リストがソートされているので、あなたがlist_name[0]list_name[-1]min(list_name)max(list_name)を置き換えることができます:あなたは、次のように進むことができ。

def merge(li): 
    return [li[i] + range(li[i][-1]+1, li[i+1][0]) + li[i+1] 
       if li[i+1][0] - li[i][-1] <7 
       else li[i] for i in range(len(li)-1)] 

実行の詳細:: `np.arange`を使用する理由

In [94]: def merge(li): 
    ...:  return [li[i]+range(max(li[i])+1, min(li[i+1]))+li[i+1] 
      if min(li[i+1])-max(li[i])<7 
      else li[i] for i in range(len(li)-1)] 
    ...: 
    ...: 

In [95]: merge(li) 
Out[95]: [[18, 19, 20, 21, 22, 23, 24, 25, 26, 27], [25, 26, 27]] 

In [96]: merge(li2) 
Out[96]: [[15, 16, 17], [32, 33, 34, 35], [89, 90, 91, 92, 93, 94, 95, 96, 97, 98]] 
関連する問題