我发现this question与我的有关。在该问题中,将处理一个特定的情况,当连续的元素之间的差异大于1时,将拆分整数列表。
我想知道:是否有办法使参数N的差值起作用?即,假设我们有以下列表:
[1,2,3,6,8,10,14,15,17,20]
对于N=2
,输出应为:
[[1,2,3], [6,8,10], [14,15,17], [20]]
对于N=3
,输出应为:
[[1,2,3,6,8,10], [14,15,17,20]]
对于N=4
,输出应该是相同的输入列表。
我是这样做的:
from itertools import takewhile
input_list = [1,2,3,6,8,10,14,15,17,20]
N = 4
def fun(l, N, output=[]):
if len(l):
output.append([x[1] for x in takewhile(lambda x: x[1]-x[0]<=N,
zip([l[0]]+l, l))])
fun(l[len(output[-1]):], N, output)
return output
fun(input_list, N)
但是我不是很喜欢它:这是不可读的。一线时尚的东西或漂亮的蟒蛇皮将不胜感激!
答案 0 :(得分:0)
def spacer(data, n=1):
set(data)
output = [[data[0]]]
for i in data[1:]:
if i - output[-1][-1] > n:
output.append([i])
else:
output[-1].append(i)
return output
data = [1, 2, 3, 6, 8, 10, 14, 15, 17, 20]
for i in range(1, 4):
print("N={}, {}".format(i, spacer(data, n=i)))
输出:
N=1, [[1, 2, 3], [6], [8], [10], [14, 15], [17], [20]]
N=2, [[1, 2, 3], [6, 8, 10], [14, 15, 17], [20]]
N=3, [[1, 2, 3, 6, 8, 10], [14, 15, 17, 20]]
答案 1 :(得分:0)
两行具有列表理解:
def split_list(l, n):
index_list = [None] + [i for i in range(1, len(l)) if l[i] - l[i - 1] > n] + [None]
return [l[index_list[j - 1]:index_list[j]] for j in range(1, len(index_list))]
测试:
example = [1, 2, 3, 6, 8, 10, 14, 15, 17, 20]
for i in range(2,5):
print(split_list(example, i))
# [[1, 2, 3], [6, 8, 10], [14, 15, 17], [20]]
# [[1, 2, 3, 6, 8, 10], [14, 15, 17, 20]]
# [[1, 2, 3, 6, 8, 10, 14, 15, 17, 20]]