使用python获取列表的随机唯一区域

时间:2015-05-05 04:26:36

标签: python

我有一个数字列表,比如list=[100,102,108,307,365,421,433,487,511,537,584]

我希望从此列表中获取唯一的区域,例如102-307的区域1,区域2的421-487和区域3的511-584。这些区域应该是非重叠和独特的。

1 个答案:

答案 0 :(得分:0)

虽然我没有使用他提供的功能(random.sample),但我会认为@TimPietzcker指的是这个答案的方向。

在此代码中,我使用{{1}选择list_中的六个索引(从list重命名以避免覆盖内置的而无需替换) }。然后我对这些索引进行排序并迭代每对相邻索引,将该对中的第一个索引(np.random.choice)到第二个(i)的值作为区域,包含< / em>(因此j)。

(如果我使用j + 1而不是j,由于在选择阶段缺少替换,索引永远不能包含列表中的所有值。例如,如果一对为j + 1,下一对的第一个索引的最小值为(1, 3),因为4无法选择两次。因此,第一对将取值为3索引12,以及3处的值将被跳过。)

由于j可能等于len(list_) - 1,因此我添加了try / except部分,该部分会抓住IndexError在这种情况下被引发并导致该区域包括list_末尾的所有值 - 相当于将ij的值包括在内,与所有其他情况一样。

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:])