객체 목록이 있고 섞고 싶습니다. 나는이 random.shuffle
방법을 사용할 수 있다고 생각 했지만 목록이 객체 일 때 실패하는 것 같습니다. 객체를 섞는 방법이 나이 주위에 다른 방법이 있습니까?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
실패합니다.
객체 목록이 있고 섞고 싶습니다. 나는이 random.shuffle
방법을 사용할 수 있다고 생각 했지만 목록이 객체 일 때 실패하는 것 같습니다. 객체를 섞는 방법이 나이 주위에 다른 방법이 있습니까?
import random
class A:
foo = "bar"
a1 = a()
a2 = a()
b = [a1, a2]
print(random.shuffle(b))
실패합니다.
답변:
random.shuffle
작동해야합니다. 다음은 객체가 목록 인 예입니다.
from random import shuffle
x = [[i] for i in range(10)]
shuffle(x)
# print(x) gives [[9], [2], [7], [0], [4], [5], [3], [1], [8], [6]]
# of course your results will vary
셔플은 제자리 에서 작동 하며 없음을 반환합니다.
random
모듈의 문서 에 자세히 설명되어 있습니다 .
random.sample(x, len(x))
사본을 사용 하거나 복사 할 수 있습니다 shuffle
. 들어 list.sort
있는 지금 거기에, 비슷한 문제를 가지고 list.sorted
있지만 대해 유사한 변종이 아니다 shuffle
.
from random import SystemRandom
대신 사용하십시오. cryptorand = SystemRandom()
행 3을 추가 하고cryptorand.shuffle(x)
내부 셔플 링을 배운대로 문제가 발생했습니다. 나는 또한 자주 문제가 있으며 종종 목록을 복사하는 방법을 잊어 버리는 것 같습니다. 사용 sample(a, len(a))
은 len(a)
표본 크기로 사용하는 솔루션 입니다. Python 설명서는 https://docs.python.org/3.6/library/random.html#random.sample 을 참조 하십시오 .
다음 random.sample()
은 섞은 결과를 새 목록으로 반환 하는 간단한 버전 입니다.
import random
a = range(5)
b = random.sample(a, len(a))
print a, b, "two list same:", a == b
# print: [0, 1, 2, 3, 4] [2, 1, 3, 4, 0] two list same: False
# The function sample allows no duplicates.
# Result can be smaller but not larger than the input.
a = range(555)
b = random.sample(a, len(a))
print "no duplicates:", a == list(set(b))
try:
random.sample(a, len(a) + 1)
except ValueError as e:
print "Nope!", e
# print: no duplicates: True
# print: Nope! sample larger than population
old = [1,2,3,4,5]; new = list(old); random.shuffle(new); print(old); print(new)
(줄 바꿈으로 대체)
old[:]
또한 목록을 위해 얕은 사본을 할 수 old
있습니다.
sample()
데이터 분석 프로토 타이핑에 특히 유용합니다. sample(data, 2)
파이프 라인의 글루 코드를 설정 한 다음 최대 단계적으로 "확대"합니다 len(data)
.
이미 numpy를 사용하고 있다면 (과학 및 금융 응용 프로그램에 매우 인기가 있음) 수입을 절약 할 수 있습니다.
import numpy as np
np.random.shuffle(b)
print(b)
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html
>>> import random
>>> a = ['hi','world','cat','dog']
>>> random.shuffle(a,random.random)
>>> a
['hi', 'cat', 'dog', 'world']
그것은 나를 위해 잘 작동합니다. 무작위 방법을 설정하십시오.
목록이 여러 개인 경우 순열을 정의하고 (목록을 섞거나 목록의 항목을 다시 정렬하는 방법) 먼저 모든 목록에 적용 할 수 있습니다.
import random
perm = list(range(len(list_one)))
random.shuffle(perm)
list_one = [list_one[index] for index in perm]
list_two = [list_two[index] for index in perm]
목록이 numpy 배열이면 더 간단합니다.
import numpy as np
perm = np.random.permutation(len(list_one))
list_one = list_one[perm]
list_two = list_two[perm]
함수 mpu
가있는 작은 유틸리티 패키지 를 만들었습니다 consistent_shuffle
.
import mpu
# Necessary if you want consistent results
import random
random.seed(8)
# Define example lists
list_one = [1,2,3]
list_two = ['a', 'b', 'c']
# Call the function
list_one, list_two = mpu.consistent_shuffle(list_one, list_two)
참고 mpu.consistent_shuffle
인수의 임의의 수를합니다. 따라서 세 개 이상의 목록을 섞을 수도 있습니다.
from random import random
my_list = range(10)
shuffled_list = sorted(my_list, key=lambda x: random())
이 대안은 주문 기능을 교체하려는 일부 응용 프로그램에 유용 할 수 있습니다.
sorted
이것은 기능 셔플입니다 (당신이 그런 종류의 일에 있다면).
numpy 배열을 사용하는 경우 배열에서 random.shuffle
생성 된 중복 데이터를 사용하는 경우가 있습니다.
대안은을 사용하는 것 numpy.random.shuffle
입니다. 이미 numpy를 사용하고 있다면 generic보다 선호되는 방법 random.shuffle
입니다.
예
>>> import numpy as np
>>> import random
사용 random.shuffle
:
>>> foo = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> foo
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> random.shuffle(foo)
>>> foo
array([[1, 2, 3],
[1, 2, 3],
[4, 5, 6]])
사용 numpy.random.shuffle
:
>>> foo = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> foo
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> np.random.shuffle(foo)
>>> foo
array([[1, 2, 3],
[7, 8, 9],
[4, 5, 6]])
random.shuffle
문서는 소리한다 NumPy와 배열을 사용하지 마십시오
'print func (foo)'는 'foo'와 함께 호출 될 때 'func'의 반환 값을 인쇄합니다. 그러나 'shuffle'은 목록이 수정되므로 아무것도 인쇄하지 않으므로 반환 유형으로 None을 갖습니다. 해결 방법 :
# shuffle the list in place
random.shuffle(b)
# print it
print(b)
함수형 프로그래밍 스타일에 더 관심이 있다면 다음과 같은 래퍼 함수를 만들 수 있습니다.
def myshuffle(ls):
random.shuffle(ls)
return ls
random.sample(ls, len(ls))
해당 경로를 실제로 내려 가고 싶은 경우 와 같은 것을 원할 것 입니다.
리스트를 매개 변수로 사용하고 뒤섞인 버전의리스트를 리턴하는 함수를 작성할 수 있습니다.
from random import *
def listshuffler(inputlist):
for i in range(len(inputlist)):
swap = randint(0,len(inputlist)-1)
temp = inputlist[swap]
inputlist[swap] = inputlist[i]
inputlist[i] = temp
return inputlist
""" to shuffle random, set random= True """
def shuffle(x,random=False):
shuffled = []
ma = x
if random == True:
rando = [ma[i] for i in np.random.randint(0,len(ma),len(ma))]
return rando
if random == False:
for i in range(len(ma)):
ave = len(ma)//3
if i < ave:
shuffled.append(ma[i+ave])
else:
shuffled.append(ma[i-ave])
return shuffled
def shuffle(_list):
if not _list == []:
import random
list2 = []
while _list != []:
card = random.choice(_list)
_list.remove(card)
list2.append(card)
while list2 != []:
card1 = list2[0]
list2.remove(card1)
_list.append(card1)
return _list
_list.extend(list2)
는보다 간결하고 효율적인 로 대체 될 수 있습니다 .
계획 : 무거운 물건 들기를 위해 라이브러리에 의존하지 않고 셔플을 작성하십시오. 예 : 요소 0으로 시작하는 목록부터 시작하십시오. 6과 같이 새로운 임의의 위치를 찾고 6에 0의 값을, 0에 6의 값을 넣으십시오. 요소 1로 이동하여이 과정을 반복하십시오.
import random
iteration = random.randint(2, 100)
temp_var = 0
while iteration > 0:
for i in range(1, len(my_list)): # have to use range with len()
for j in range(1, len(my_list) - i):
# Using temp_var as my place holder so I don't lose values
temp_var = my_list[i]
my_list[i] = my_list[j]
my_list[j] = temp_var
iteration -= 1
my_list[i], my_list[j] = my_list[j], my_list[i]
잘 작동합니다. 함수를 목록 객체로 사용하여 여기에서 시도하고 있습니다.
from random import shuffle
def foo1():
print "foo1",
def foo2():
print "foo2",
def foo3():
print "foo3",
A=[foo1,foo2,foo3]
for x in A:
x()
print "\r"
shuffle(A)
for y in A:
y()
foo1 foo2 foo3 foo2 foo3 foo1 (마지막 행의 foo는 임의의 순서를 가짐)