왜 파이썬 으로 random.shuffle
돌아 None
오나요?
>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> print shuffle(x)
None
대신 셔플 된 값을 얻으려면 어떻게해야 None
합니까?
답변
random.shuffle()
x
목록 을 제자리에서 변경합니다 .
내부 구조를 변경하는 Python API 메서드는 일반적으로 None
수정 된 데이터 구조가 아니라를 반환 합니다.
기존 목록이 순서대로 유지되는 기존 목록을 기반으로 무작위로 셔플 된 새 목록 을 만들려면 random.sample()
입력의 전체 길이와 함께 사용할 수 있습니다 .
x = ['foo', 'bar', 'black', 'sheep']
random.sample(x, len(x))
정렬 키에 sorted()
with random.random()
를 사용할 수도 있습니다 .
shuffled = sorted(x, key=lambda k: random.random())
그러나 이것은 정렬 (O (NlogN) 작업)을 호출하는 반면, 입력 길이에 대한 샘플링은 O (N) 작업 만 수행합니다 (사용되는 것과 동일한 프로세스 random.shuffle()
, 축소되는 풀에서 임의 값 교체).
데모:
>>> import random
>>> x = ['foo', 'bar', 'black', 'sheep']
>>> random.sample(x, len(x))
['bar', 'sheep', 'black', 'foo']
>>> sorted(x, key=lambda k: random.random())
['sheep', 'foo', 'black', 'bar']
>>> x
['foo', 'bar', 'black', 'sheep']
답변
이 방법도 작동합니다.
import random
shuffled = random.sample(original, len(original))
답변
문서 에 따르면 :
시퀀스 x를 제자리에 섞습니다. 임의의 인수 인 random은 [0.0, 1.0에서 임의의 부동 소수점을 반환하는 0 인수 함수입니다. 기본적으로 이것은 random () 함수입니다.
>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> shuffle(x)
>>> x
['bar', 'black', 'sheep', 'foo']
답변
왜 그래요?
1. 효율성
shuffle
목록을 제자리에서 수정합니다. 원본 목록이 더 이상 필요하지 않은 경우 큰 목록을 복사하는 것은 순수한 오버 헤드가되기 때문에 좋습니다.
2. Pythonic 스타일
pythonic style 의 “명시적인 것이 암묵적인 것보다 낫다”라는 원칙에 따르면 , 목록을 반환하는 것은 나쁜 생각 일 것입니다. 왜냐하면 실제로는 그렇지 않지만 새로운 것으로 생각할 수 있기 때문 입니다.
그러나 나는 이것을 좋아하지 않는다!
당신이 경우 않는 새로운 목록이 필요합니다, 당신은 뭔가를 작성해야합니다
new_x = list(x) # make a copy
random.shuffle(new_x)
멋지게 명시 적입니다. 이 관용구가 자주 필요하면 을 반환 하는 함수 shuffled
(참조 sorted
)로 감싸십시오 new_x
.
답변
나는 다음과 같은 개념으로 나의 아하 순간을 보냈습니다.
from random import shuffle
x = ['foo','black','sheep'] #original list
y = list(x) # an independent copy of the original
for i in range(5):
print shuffle(y) # shuffles the original "in place" prints "None" return
print x,y #prints original, and shuffled independent copy
>>>
None
['foo', 'black', 'sheep'] ['foo', 'black', 'sheep']
None
['foo', 'black', 'sheep'] ['black', 'foo', 'sheep']
None
['foo', 'black', 'sheep'] ['sheep', 'black', 'foo']
None
['foo', 'black', 'sheep'] ['black', 'foo', 'sheep']
None
['foo', 'black', 'sheep'] ['sheep', 'black', 'foo']
답변
구조 자체를 변경하는 Python API 는 출력으로 None 을 반환합니다 .
list = [1,2,3,4,5,6,7,8]
print(list)
출력 : [1, 2, 3, 4, 5, 6, 7, 8]
from random import shuffle
print(shuffle(list))
출력 : 없음
from random import sample
print(sample(list, len(list)))
출력 : [7, 3, 2, 4, 5, 6, 1, 8]
답변
random.sample()
다른 사람의 설명에 따라 셔플 된 목록을 반환 할 수 있습니다 . 그것은 대체하지 않고 목록에서 k 요소를 샘플링하여 작동합니다 . 따라서 목록에 중복 요소가있는 경우 고유하게 처리됩니다.
>>> l = [1,4,5,3,5]
>>> random.sample(l,len(l))
[4, 5, 5, 3, 1]
>>> random.sample(l,len(l)-1)
[4, 1, 5, 3]
>>> random.sample(l,len(l)-1)
[3, 5, 5, 1]