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

使用python获取列表的随机唯一区域,python,Python,我有一个数字列表,比如list=[10010210830736354214334871537584] 我想从这个列表中获得唯一的区域,例如102-307中的区域1、421-487中的区域2和511-584中的区域3。这些区域应该是不重叠和唯一的。我相信@TimPietzcker为我指出了这个答案的方向,尽管我没有使用他提供的random.sample函数 在这段代码中,我使用np.random.choice从列表中选择了六个索引uu从列表中重命名,以避免在不替换的情况下覆盖内置索引。然后,我对这

我有一个数字列表,比如list=[10010210830736354214334871537584]


我想从这个列表中获得唯一的区域,例如102-307中的区域1、421-487中的区域2和511-584中的区域3。这些区域应该是不重叠和唯一的。

我相信@TimPietzcker为我指出了这个答案的方向,尽管我没有使用他提供的random.sample函数

在这段代码中,我使用np.random.choice从列表中选择了六个索引uu从列表中重命名,以避免在不替换的情况下覆盖内置索引。然后,我对这些索引进行排序,并迭代每对相邻的索引,将从第一个索引I到该对中的第二个j(包括j+1)的值作为一个区域

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

因为j可能等于lenlist_u1,所以我包含了一个try/except部分,它捕获在本例中引发的索引器,并使区域包含列表_u1末尾的所有值,相当于将值从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:])

我有点困惑。您似乎有一个区域边界列表,并给出了一个示例,其中一些边界已被选择,但随后说您希望区域的开始和结束之间的差异应随机介于200到1000之间,这在您的大多数示例中并非如此。此外,您可能需要指定您关心的随机性类型。选择边界的不同方法可能会导致结果中出现不同的随机分布。你说过,但这没有帮助。这没用什么?问题是什么?看起来你所需要做的就是从列表中随机选取6个元素,然后对结果进行排序sortedrandom.samplemylist,6。然后有一个具有三个范围的开始-停止序列。对吗?我觉得你应该能够使用numpy.split,然后从结果中选择3,以从list_@paddyg中获得区域列表。嗯,我看不到允许使用numpy.split的孔的方法,即一些未选择的值,而不是从结果分割中的每个区域随机删除零个或多个项目。但是感谢您向我介绍numpy.split。索引[1::2]产生的结果与您的代码相同吗?i、 e.备用拆分是起始索引或结束索引index@paddyg不,没有。您的代码使某些值在拆分时总是被忽略。您可以运行它来确认这一点。我刚刚做了。你是对的,添加一行索引[1::2]+=1降低了此方法可能具有的简单性。还需要更改为..np.random.ChoiceLineList_u1,n_regions*2,以保持索引在边界内