각 요소의 사본이 두 개인 목록이 필요한 경우 원본 목록이 2 개보다 길면이 기능이 작동하지 않는 이유가 있습니까?
In [138]: a=['airplane','track','car','train']
In [139]: a + a
Out[139]: ['airplane', 'track', 'car', 'train', 'airplane', 'track', 'car', 'train']
당신은 다음을 "어떻게 그들이 동일한 요소의 두 가지 요소 내에서 표시되지 않습니다 있도록 내 목록 요소의 순열의 공간에서 샘플 않는다"의보다 추상적 인 질문을하는 경우해야 작업.
는 요소가 두 번 표시 어떤 구조를 점점
a + a
만큼 쉽게 한 다음
a + a
의 순열을 제한하지 걱정할 수
주 - overthink 할 필요는 문제의 일부 "내가 어떻게 각각의 두받을 수 있나요" . 그런 다음이로 사용할 수 있습니다
import random
def valid_duplicate_spacing(x):
for i, elem in enumerate(x):
if elem in x[i+1:i+3]:
return False
return True
def sample_permutations_with_duplicate_spacing(seq):
sample_seq = seq + seq
random.shuffle(sample_seq)
while not valid_duplicate_spacing(sample_seq):
random.shuffle(sample_seq)
return sample_seq
은 다음과 같습니다
In [165]: sample_permutations_with_duplicate_spacing(a)
Out[165]: ['airplane', 'train', 'track', 'car', 'train', 'track', 'car', 'airplane']
In [166]: sample_permutations_with_duplicate_spacing(a)
Out[166]: ['train', 'airplane', 'car', 'track', 'train', 'airplane', 'track', 'car']
당신은 단순히 무작위로 두 사람은 다음에 대한 샘플, 당신은 할 수립니다 대체되지 않도록, 목록에서 샘플링에 대해 이야기하는 경우
In [146]: foo = draw_with_delayed_replacement(a)
In [147]: foo.next()
Out[147]: 'car'
In [148]: foo.next()
Out[148]: 'train'
In [149]: foo.next()
Out[149]: 'track'
In [150]: foo.next()
Out[150]: 'car'
In [151]: foo.next()
Out[151]: 'train'
In [152]: foo.next()
Out[152]: 'track'
In [153]: foo.next()
Out[153]: 'car'
In [154]: foo.next()
Out[154]: 'airplane'
In [155]: foo.next()
Out[155]: 'track'
In [156]: foo.next()
Out[156]: 'train'
:
import random
def draw_with_delayed_replacement(seq):
drawn = random.choice(seq)
rejectables = [drawn]
yield drawn
drawn = random.choice(seq)
while drawn in rejectables:
drawn = random.choice(seq)
rejectables.append(drawn)
yield drawn
while True:
drawn = random.choice(seq)
if drawn in rejectables:
continue
else:
rejectables.pop(0)
rejectables.append(drawn)
yield drawn
그런 다음 다음과 같은 작업을 수행 할 수 있습니다 발전기를 사용
그러나이 경우 각 요소가 정확히 두 번 나타나는 샘플을 얻을 수 있다고 보장 할 수는 없으며 작은 목록에서는 비효율적 일 수 있습니다.
대단히 감사합니다. 해결책 1은 내가해야 할 일이다. 그런데 위대한 설명. 모든 것이 완벽하게 이해됩니다. 솔루션 2는 재미 있습니다! – Bastien