2017-07-04 9 views
-1

条件に基づいてリストを複数のリストに分割したい。シリーズの相違が4以上になると、最後の分割項目からその項目までリストを分割することがトリガーになります。例えばリストを条件ごとにリストに分割する方法は?

:条件によって

in = [1,2,3,9,10,11,100,200] 
out = [ [1,2,3 ], [ 9,10,11 ], [100], [200] ] 

If (next - prev) > 4 
+2

はあなたが何を表示することができますあなたはこれまでに試しましたか?たぶんあなたは本当に近くにありました。余分な目があなたが作っている小さな間違いを見つけるのを助けるでしょうか? – idjaw

+0

'next'と' prev'とは何でしょうか?その条件はどのようにその出力を作りますか? – Sayse

+1

あなたの状態を考えれば、 '[...、[100]、[200]]' –

答えて

2
def splitlist(L): 
    if not L: return [] 
    answer = [[L[0]]] 

    for i in L[1:]: 
     if i - answer[-1][-1] < 4: 
      answer[-1].append(i) 
     else: 
      answer.append([i]) 
    return answer 

出力:

In [112]: splitlist([1,2,3,9,10,11,100,200]) 
Out[112]: [[1, 2, 3], [9, 10, 11], [100], [200]] 
2

注意:ではそれぞれPythonキーワードと組み込み関数です。ある

in_list = [1, 2, 3, 9, 10, 11, 100, 200] 

parts = [[]] 
for prev_item, next_item in zip(in_list[:-1], in_list[1:]): 
    top = parts[-1] 
    top.append(prev_item) 
    if next_item - prev_item > 4: 
     parts.append([]) 
top = parts[-1] 
top.append(in_list[-1]) 

出力:numpyモジュールを使用して

[[1, 2, 3], [9, 10, 11], [100], [200]] 
2

ショート溶液:

トリックは、同じリストの2つのスライスとzip()関数を使用することであるが、一つの項目にシフト

import numpy as np 

arr = np.array([1,2,3,9,10,11,100,200]) 
out = [a.tolist() for a in np.split(arr, np.where(np.diff(arr) > 4)[0]+1)] 
print(out) 

出力:

[[1, 2, 3], [9, 10, 11], [100], [200]] 

  • np.where(np.diff(arr) > 4) - によって初期アレイを分割 -が

  • np.split(x, indices)が満たされる条件"次の値と前回値との差が4よりも大きい" 配列インデックスを見つけます。重要な指標

+0

数値的なアプローチが好き。 –

0

ssibleアプローチ:

ls = [1,2,3,9,10,11,100,200, 201, 209] 

#output list 
output = list() 
startind = 0 

for ind, val in enumerate(ls): 
    if ls[ind]-ls[ind-1] > 4: 
     output.append(ls[startind:ind]) 
     startind = ind 

# appending the left over from last detected difference of 4 
output.append(ls[startind:]) 
print output 

出力:[[1、2、3]、[9、10、11]、[100]、[200、201]、[209]]

関連する問題