数字のリストが与えられていると、隣接する2つの要素の距離がnより大きい場合、どのように分割することができますか?Pythonで連続した要素の距離に基づいて数値のリストを分割する方法は?
入力:
n = 3
l = [1, 2, 5, 3, -2, -1, 4, 5, 2, 4, 8]
出力:
[[1, 2, 5, 3], [-2, -1], [4, 5, 2, 4], [8]]
数字のリストが与えられていると、隣接する2つの要素の距離がnより大きい場合、どのように分割することができますか?Pythonで連続した要素の距離に基づいて数値のリストを分割する方法は?
入力:
n = 3
l = [1, 2, 5, 3, -2, -1, 4, 5, 2, 4, 8]
出力:
[[1, 2, 5, 3], [-2, -1], [4, 5, 2, 4], [8]]
あなたはジッパーを使用してそれを行うことができます:zipファイルを使用して
# initialization
>>> lst = [1, 2, 5, 3, -2, -1, 4, 5, 2, 4, 8]
>>> n = 3
検索分割場所:前の結果を使用して
>>> indices = [i + 1 for (x, y, i) in zip(lst, lst[1:], range(len(lst))) if n < abs(x - y)]
スライスsubslists:
# pad start index list with 0 and end index list with length of original list
>>> result = [lst[start:end] for start, end in zip([0] + indices, indices + [len(lst)])]
>>> result
[[1, 2, 5, 3], [-2, -1], [4, 5, 2, 4], [8]]
コード
from boltons import iterutils
def grouponpairs(l, f):
groups = []
g = []
pairs = iterutils.pairwise(l + [None])
for a, b in pairs:
g.append(a)
if b is None:
continue
if not f(a, b):
groups.append(g)
g = []
groups.append(g)
return groups
テスト
grouponpairs([1, 2, 5, 3, -2, -1, 4, 5, 2, 4, 8], lambda a, b: abs(a - b) <= 3)
# [[1, 2, 5, 3], [-2, -1], [4, 5, 2, 4], [8]]
をここですより原始的それは効率的ではないにも関わらず、あなたは何をしたいのか達成したコードの一部(より効率的なソリューションのためのReut Sharabaniの回答を参照してください。)
# Input list
l = [1, 6, 5, 3, 5, 0, -3, -5, 2]
# Difference to split list with
n = 3
output = []
t = []
for i in range(1, len(l)):
t.append(l[i])
if abs(l[i] - l[i - 1]) < n:
None
else:
output.append(t)
t = []
return output
n = 3
a = [1, 2, 5, 3, -2, -1, 4, 5, 2, 4, 8]
b = [abs(i - j) > n for i, j in zip(a[:-1], a[1:])]
m = [i + 1 for i, j in enumerate(b) if j is True]
m = [0] + m + [len(a)]
result = [a[i: j] for i, j in zip(m[:-1], m[1:])]
print(result)
これが答えたり、質問に加えますか? – Jerrybibo
これは私の提案ですが、より良い解決策を探しています。 – Stefanus