2016-08-02 2 views
3

목록에서 항목을 임의로 선택하여 다른 목록에 추가하려고합니다.목록에서 항목을 임의로 선택하여 바꾸지 않고 다른 목록에 추가하려고합니다.

요소 나는이 같은 외모에서 선택하고있어 목록 :

data=[2,3,4,7,8,12,17,24,27,33,35,36,37,38,40,43,44,50,51,54] 

내가 각 목록은 같은 수의 가질 때까지 무작위로이 목록에서 요소를 가지고 네 개의 목록 중 하나에 추가 할 집단.

lists=[[1,'x','x','x','x','x'],[3,'x','x','x','x','x'],[5,'x','x','x','x','x'],[7,'x','x','x','x','x']] 

내가 random.choice를 사용하여 시도했지만이 나에게주는 중복 :

def fill_lists(data): 
for list in lists: 
    for n,i in enumerate(list): 
     if i=='x': 
      list[n]= random.choice(data) 

내가 내 기능은 각 아니오 데이터 목록의 무작위 표본을 포함하는 4 명 목록을 포함하는 목록을 반환 할 중복. 또한 각 목록의 첫 번째 요소를 이미 목록에 배치 한 값으로 지정해야합니다.

+0

먼저 데이터의 값을 무작위로 바꾸고 목록을 채우기 시작합니다. –

+1

데이터를 스크램블하고 분할하는 것입니다. 파이썬에서 어떻게 할 지 모르지만'split (sample (data), 012 (1 : 4, 5)) –

답변

3
import random 
data=[2,3,4,7,8,12,17,24,27,33,35,36,37,38,40,43,44,50,51,54] 
random.shuffle(data) 
lists = [data[i:i+len(data)/4] for i in range(0, len(data), len(data)/4)] 
print(lists) 

초기 목록에서 무작위로 당기면 순서가 바뀌면서 동일한 효과를 갖습니다. 그런 다음 하위 목록으로 분할 할 수 있습니다. 하위 목록을 정렬해야하는 경우 나중에 목록에 정렬을 매핑하십시오.

당신은 len(data)/4

편집의 제수를 변경하여 그룹의 수를 변경할 수 있습니다

:

heads = [1,3,5,7] 
[q.insert(0,p) for p,q in zip(heads,lists)] 
+0

OP는 값을 새 목록에 넣으려고합니다. 그래서 list = [data [i : i + 4] for range (0, len , 4)] – Checkmate

+0

나는 새 목록에 값을 넣을 것이다. 이전 목록을 삭제할 수 있다고 가정했으나 그렇지 않은 경우 셔플 링하기 전에 데이터를 복사 할 수있었습니다. – dashiell

+0

충분합니다. 나는 방금 예제와 같은 결과를 내기 위해 이름 붙여 넣기를 시도했다. – Checkmate

0

당신은 random.sample 사용할 수 있습니다

data=[2,3,4,7,8,12,17,24,27,33,35,36,37,38,40,43,44,50,51,54] 
random.sample(data, 5) 
# [27, 12, 33, 24, 17] 

그것의 중첩 된 목록을 얻으려면, 지능형리스트

[random.sample(data, 5) for _ in range(5)] 
# [[40, 35, 24, 54, 17], 
# [17, 54, 35, 43, 37], 
# [40, 4, 43, 33, 44], 
# [51, 37, 35, 33, 8], 
# [54, 4, 44, 27, 50]] 

편집을 사용 : 위의 당신에게 고유 값을 제공하지 않습니다; 당신은 고유 값에 대해 위의 대답을 받아 들여야합니다. 나는 틀린 질문을 해석했다!

0

당신은 d 함수 내에서 범위를 수정이 시도 할 수 있습니다 : 당신의 질문에이 부분을 놓친 원하는 숫자 요소를 조정하십시오.

import random 

def f(data): 
    val = random.choice(data) 
    ix = data.index(val) 
    data.pop(ix) 
    return val, data 

def d(data): 
    topholder = [] 
    m = len(data)/4 
    for i in range(4): 
     holder = [] 
     for n in range(m): 
      holder.append(f(data)[0]) 
     topholder.append(holder) 
    return topholder 

d(data) 

이렇게하면 무작위로 샘플링 된 값의 목록이 중복없이 4 번 제공됩니다.

0

다른 셔플 기반이지만 요소 수가 많은 경우 목록의 수로 나눌 수없는 경우 모든 하위 목록의 크기가 동일해야합니다 (예 : 7 개 시도).

from random import shuffle 

def split(data, n): 
    size=int(len(data)/n); 
    for i in range(0, n*size, size): 
     yield data[i:i+size] 


data=[2,3,4,7,8,12,17,24,27,33,35,36,37,38,40,43,44,50,51,54] 
shuffle(data) 
list(split(data, 5)) 
0

이것은 각 목록이 지정된 값으로 시작하는 목록의 목록을 반환하는 동적 함수입니다. 중첩 목록의 양은 starting_values ​​의 양으로 결정됩니다.

import random 

def get_random_list(element_list, starting_values, size_per_group): 
    num_of_groups = len(starting_values) 
    size_per_group -= 1 
    total_elements = num_of_groups * size_per_group 
    random_data = random.sample(element_list, total_elements) 
    return [[starting_values[x]] + random_data[x * size_per_group:(x + 1) * size_per_group] for x in range(num_of_groups)] 

data = [2, 3, 4, 7, 8, 12, 17, 24, 27, 33, 35, 36, 37, 38, 40, 43, 44, 50, 51, 54] 

print(get_random_list(data, starting_values=[1, 2, 3, 4, 5, 6], size_per_group=2)) 
# OUTPUT: [[1, 36], [2, 54], [3, 17], [4, 7], [5, 35], [6, 33]] 
print(get_random_list(data, starting_values=[9, 3, 5], size_per_group=6)) 
# OUTPUT: [[9, 54, 2, 7, 38, 24], [3, 35, 8, 37, 40, 17], [5, 44, 4, 27, 50, 3]] 

그것은 Python2.x 및 Python3.x을 위해 작동하지만 Python2.x 당신의 메모리를보다 효율적으로 사용하기위한 xrange()range()을 변경해야합니다.

관련 문제