我有兩個串列如下
a = [646, 650, 654, 658, 662, 666, 670, 674, 678, 682, 686, 690, 694, 698, 702, 706, 13565, 13569, 13573, 13577, 13581, 13585, 13589, 13593, 13597, 13601, 13605, 13609, 13613, 13617, 13621, 13625, 13629, 13633, 13637, 13641, 13645, 13649, 13653, 13657, 13661, 21237, 21241, 21245, 21249, 21253, 21257, 21261, 21265, 21269, 21273, 21277, 21281, 21285, 21289, 21293, 21297, 21301, 21305, 21309, 21313, 21317, 21321, 21325, 21329, 21333, 21337, 21341, 21345]
b = [646, 706, 13661, 21345]
所以基本上我想根據 list 的a開始停止值將 list分成更小的塊b。像這樣的東西
[
[646, 650, 654, 658, 662, 666, 670, 674, 678, 682, 686, 690, 694, 698, 702, 706],
[13565, 13569, 13573, 13577, 13581, 13585, 13589, 13593, 13597, 13601, 13605, 13609, 13613, 13617, 13621, 13625, 13629, 13633, 13637, 13641, 13645, 13649, 13653, 13657, 13661],
[21237, 21241, 21245, 21249, 21253, 21257, 21261, 21265, 21269, 21273, 21277, 21281, 21285, 21289, 21293, 21297, 21301, 21305, 21309, 21313, 21317, 21321, 21325, 21329, 21333, 21337, 21341, 21345]
]
有人可以幫我解決這個問題嗎?
uj5u.com熱心網友回復:
從您的示例中,我了解到您希望第一個間隔包括邊界 ([646, 706]),而其他間隔必須僅包括上邊界 (]706, 13661], ]13661, 21345])。
我在這里使用 .index 方法和一個 for 回圈,它考慮第一個區間的下邊界并將其排除在其他區間:
lists_result = []
for i in range(len(b[:-1])):
idx_inf = a.index(b[i])
idx_sup = a.index(b[i 1])
if i == 0:
lists_result.append(a[idx_inf:idx_sup 1])
else:
lists_result.append(a[idx_inf 1:idx_sup 1])
uj5u.com熱心網友回復:
解決方案 1:使用 bisect
我將通過使用該bisect模塊查找每個專案a將被插入的位置b來確定專案屬于哪個 bin來解決這個問題。
此解決方案不需要a對其進行排序,但確實需要b對其進行排序。
bin_boundaries = sorted(b)
results = [[] for _ in range(len(bin_boundaries) 1)]
for i in a:
pos = bisect.bisect_left(bin_boundaries, i)
results[pos].append(i)
print(results)
現在,您沒有指定是否需要與上一個或下一個 bin 中的邊界相等的專案。我把它放在以前的垃圾箱里。如果您的意思是下一個,請替換bisect_left為bisect_right上面的。
我還輸出了您預期輸出顯示的另外兩個 bin:第一個 bin 的專案小于第一個 bin 邊界,最后一個 bin 專案大于最后一個邊界。添加results = results[1:-1],如果你想洗掉這些邊箱。
解決方案 2:只需遍歷每個 bin 的串列
現在,這是一個更簡單的解決方案,它只遍歷a每個 bin:
bin_boundaries = sorted(b)
results = []
for low, high in zip(bin_boundaries[:-1], bin_boundaries[1:]):
results.append([i for i in a if i > low and i <= high])
print(results)
這一次,我沒有創建邊緣箱。同樣,修復>和<=以匹配您在邊緣實際想要的語意。
這個外回圈也可以變成一個串列理解,給你這個嵌套的串列理解和一個??非常緊湊的解決方案:
results = [
[i for i in a if i > low and i <= high]
for low, high in zip(bin_boundaries[:-1], bin_boundaries[1:])
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/382200.html
下一篇:獲得所有可能的翻譯產品
