私があなたのことを理解していれば、他のリスト(同じ長さのリストを想定しています)のインデックスに基づいて1つのリストを分割して、その他のリストの要素を繰り返すことでスライスの発生場所を定義します。 'エレガントな'が、最もパフォーマンスの良い方法ではなく、他のリストのn
サイズのスライスを繰り返して、現在のインデックスにall(nan_list[i:i+n])
が含まれているかどうかを確認してください。そうなら、そのインデックスの前の最初のリスト結果にスライスし、次にn
の場所をスキップして、プロセスを繰り返します。しかし私は、手続き型アプローチを好む:
def split_list(source, nan_data, nan_len=6):
result = [] # a list for our final result
last_pos = 0 # holds the last sliced position
counter = 0 # a counter for sequential NaNs
for i, is_nan in enumerate(nan_data):
if not is_nan: # encountered a non-NaN, check how many consecutive NaNs we had
if counter >= nan_len: # we have a match...
result.append(source[last_pos:i-counter]) # add a new slice to our result
last_pos = i # set the new slice position
counter = 0 # reset the counter
else:
counter += 1 # NaN found, increase the counter
# find the last slice, if any
left_over = source[last_pos:] if counter < nan_len else source[last_pos:-counter]
if left_over:
result.append(left_over)
return result # return the result
次にあなたが例えば、nan_data
リストにnan_len
連続しTrue
値(またはTrueに評価された値)に基づいて、任意のsource
リストを分割するためにそれを使用することができます。
base_list = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20"]
nan_list = [True, False, True, False, True, True, True, True, True, True,
False, True, False, True, True, False, True, True, True, False]
print(split_list(base_list, nan_list, 3))
# [['01', '02', '03', '04'], ['11', '12', '13', '14', '15', '16'], ['20']]
コードの貼り付けがコードの記述よりも優れているとは思いませんか? –
あなたの質問を書いてください:段落を使用し、例を使用してください...あなたはそのような質問を読んでみませんか? –
申し訳ありませんが、それは少し明確ですか? –