2015-05-05 4 views
-5

У меня есть список номеров, скажем list=[100,102,108,307,365,421,433,487,511,537,584].Получите случайные уникальные регионы списка, используя python

Я хочу, чтобы получить уникальные регионы из этого списка, например, регион 1 от 102-307, регион 2 от 421-487 и регион 3 от 511-584. Эти регионы должны быть непересекающимися и уникальными.

+4

Я немного смущен. Кажется, у вас есть список границ региона и дайте пример, когда некоторые из них были выбраны, но затем скажите, что вы хотите, чтобы «разница между началом и концом региона была случайной между 200 и 1000», что не является в большинстве ваших примеров. Кроме того, вам может потребоваться указать, какую случайность вы волнуете. Различные способы выбора границ могут привести к разным случайным распределениям в результатах. – Blckknght

+3

Вы сказали: «Но это не помогает». Это не помогает? В чем проблема? – GreenAsJade

+2

Похоже, вам нужно всего лишь выбрать 6 элементов из этого списка и отсортировать результат ('sorted (random.sample (mylist, 6))'). Затем у вас есть старт-стоп-последовательность с тремя диапазонами. Правильно? –

ответ

0

Я буду кредитовать @TimPietzcker за то, что указал на меня в направлении этого ответа, хотя я не использовал функцию, которую он предложил (random.sample).

В этом коде, я выбираю шесть индексов из тех, в list_ (переименован из list, чтобы избежать перезаписи встроенной) без замены, используя np.random.choice. Затем я сортирую эти индексы и перебираю по каждой паре соседних индексов, беря в качестве области значения от первого индекса (i) ко второму (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:]) 
+0

чувствую, что вы должны использовать 'numpy.split()' (затем выберите 3 из результата), чтобы получить list_of_regions из списка_ – paddyg

+0

@paddyg hmm, я не вижу способа разрешить дыры - то есть, некоторые значения остались unselected - с помощью 'numpy.split' (кроме случайного удаления нулевого или большего количества элементов из каждой« области »в результате разбиения). но спасибо за введение меня в 'numpy.split'. – dbliss

+0

не 'list_of_regions = np.split (list_, indices) [1 :: 2]' производит тот же результат, что и ваш код? то есть чередующиеся расщепления являются индексом начала или конца индекса – paddyg

Смежные вопросы