[英]Splitting list of integers such that they result in sublists with minimum difference
我將如何拆分整數列表,以便將它們放在具有最小差異的子列表中?
例如
[4,1,5,3] --> [[1], [3,4,5]], 長度 2
[4,2,1,3] --> [[1,2,3,4]],長度為1
[5,2,7,6,3,9] --> [[2,3], [5,6], [9]], 長度 3
[1,2,3,4,5,6,8,9,10] --> [[1,2,3,4,5,6], [8,9,10]],長度為2。
目前的做法是
def split(l):
res = []
n = len(l)
l.sort()
# If the list is just consecutive integers return 1
if l == list(range(min(l), max(l)+1)):
return 1
for l0, l1 in zip(l, l[1:]):
if abs(l0 - l1) <= 1:
res.append([l0, l1])
return len(res)
這適用於前三種情況,但最后一種失敗了......我認為問題是在循環中我只是通過兩個連續整數的差異來調節......
如果您被允許使用外部包, more_itertools
有split_when方法可以滿足您的需求:
import more_itertools
lst = [1,2,3,4,5,6,8,9,10]
lst.sort()
splitted = list(more_itertools.split_when(lst, lambda x, y: abs(x-y) > 1))
print(splitted)
輸出:
[[1, 2, 3, 4, 5, 6], [8, 9, 10]]
我只想檢查兩個數字之間的差異是否大於 1:
def mySplit(lst):
res = []
lst.sort()
subList = [lst[0]]
for i in range(1, len(lst)):
prev, cur = lst[i-1], lst[i]
if cur - prev > 1:
res.append(subList)
subList = []
subList.append(cur)
res.append(subList)
return res
tests = ([4,1,5,3], [4,2,1,3], [5,2,7,6,3,9], [1,2,3,4,5,6,8,9,10,13])
for test in tests:
print(mySplit(test))
出去:
[[1], [3, 4, 5]]
[[1, 2, 3, 4]]
[[2, 3], [5, 6, 7], [9]]
[[1, 2, 3, 4, 5, 6], [8, 9, 10], [13]]
使用numpy
快速運行和簡短的解決方案:
(一旦使用python -m pip install numpy
)。
import numpy as np
for l in [
[4,1,5,3],
[4,2,1,3],
[5,2,7,6,3,9],
[1,2,3,4,5,6,8,9,10],
]:
a = np.sort(l)
res = np.split(a, np.flatnonzero(np.abs(np.diff(a)) > 1) + 1)
print('input', l, 'sorted', a, '\n', 'result', res)
輸出:
input [4, 1, 5, 3] sorted [1 3 4 5]
result [array([1]), array([3, 4, 5])]
input [4, 2, 1, 3] sorted [1 2 3 4]
result [array([1, 2, 3, 4])]
input [5, 2, 7, 6, 3, 9] sorted [2 3 5 6 7 9]
result [array([2, 3]), array([5, 6, 7]), array([9])]
input [1, 2, 3, 4, 5, 6, 8, 9, 10] sorted [ 1 2 3 4 5 6 8 9 10]
result [array([1, 2, 3, 4, 5, 6]), array([ 8, 9, 10])]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.