我有一个数字列表,比如list=[100,102,108,307,365,421,433,487,511,537,584]
。
我希望从此列表中获取唯一的区域,例如102-307的区域1,区域2的421-487和区域3的511-584。这些区域应该是非重叠和独特的。
答案 0 :(得分:0)
虽然我没有使用他提供的功能(random.sample
),但我会认为@TimPietzcker指的是这个答案的方向。
在此代码中,我使用{{1}选择list_
中的六个索引(从list
重命名以避免覆盖内置的而无需替换) }。然后我对这些索引进行排序并迭代每对相邻索引,将该对中的第一个索引(np.random.choice
)到第二个(i
)的值作为区域,包含< / em>(因此j
)。
(如果我使用j + 1
而不是j
,由于在选择阶段缺少替换,索引永远不能包含列表中的所有值。例如,如果一对为j + 1
,下一对的第一个索引的最小值为(1, 3)
,因为4
无法选择两次。因此,第一对将取值为3
索引1
和2
,以及3
处的值将被跳过。)
由于j
可能等于len(list_) - 1
,因此我添加了try
/ except
部分,该部分会抓住IndexError
在这种情况下被引发并导致该区域包括list_
末尾的所有值 - 相当于将i
到j
的值包括在内,与所有其他情况一样。
import numpy as np
list_ = [100,102,108,307,365,421,433,487,511,537,584]
n_regions = 3
indices = sorted(np.random.choice(range(len(list_)), size=n_regions * 2,
replace=False))
list_of_regions = []
for i, j in zip(indices[::2], indices[1::2]):
try:
list_of_regions.append(list_[i:j + 1])
except IndexError:
# j + 1 == len(list_), so leave it off.
list_of_regions.append(list_[i:])