random.shuffle이 None을 반환하는 이유는 무엇입니까?
왜 파이썬 으로 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']
shuffle
목록을 제자리에서 수정합니다. 원본 목록이 더 이상 필요하지 않은 경우 큰 목록을 복사하는 것은 순수한 오버 헤드가되기 때문에 좋습니다.
pythonic style 의 "명시적인 것이 암묵적인 것보다 낫다"라는 원칙에 따르면 , 목록을 반환하는 것은 나쁜 생각 일 것입니다. 왜냐하면 실제로는 그렇지 않지만 새로운 것으로 생각할 수 있기 때문 입니다.
당신이 경우 않는 새로운 목록이 필요합니다, 당신은 뭔가를 작성해야합니다
new_x = list(x) # make a copy
random.shuffle(new_x)
멋지게 명시 적입니다. 이 관용구가 자주 필요하면를 반환 하는 함수 shuffled
(참조 sorted
)로 래핑 하십시오 new_x
.
>> x = ['foo','bar','black','sheep']
>> random.shuffle(x)
>> print(x)
>> ['sheep', 'bar', 'foo', 'black']
지적했듯이 random.shuffle은 제자리에 대체되므로 새 목록 변수가 필요하지 않습니다.
나는 다음과 같은 개념으로 나의 아하 순간을 보냈습니다.
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']
shuffle(x)
값을 반환하지 않습니다. 대신이 함수는 변수 자체를 섞습니다.
그러니 시도하지 마십시오
print shuffle(x)
대신 다음과 같이 변수를 인쇄하십시오.
>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> x
['bar', 'black', 'foo', 'sheep']
Python APIs which change the structure in place itself returns None as output.
list = [1,2,3,4,5,6,7,8]
print(list)
Output: [1, 2, 3, 4, 5, 6, 7, 8]
from random import shuffle
print(shuffle(list))
Output: None
from random import sample
print(sample(list, len(list)))
Output: [7, 3, 2, 4, 5, 6, 1, 8]
You can return the shuffled list using random.sample()
as explained by others. It works by sampling k elements from the list without replacement. So if there are duplicate elements in your list, they will be treated uniquely.
>>> 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]
참고URL : https://stackoverflow.com/questions/17649875/why-does-random-shuffle-return-none
'code' 카테고리의 다른 글
최신 JRE 버전이 이전 JDK 버전으로 컴파일 된 Java 프로그램을 실행할 수 있습니까? (0) | 2020.11.10 |
---|---|
pip가 내 패키지의 이전 버전을 설치하는 이유는 무엇입니까? (0) | 2020.11.10 |
밑줄 sortBy를 사용하여 개체 정렬이있는 배열 (0) | 2020.11.10 |
UserDefault가 있는지 확인-Swift (0) | 2020.11.10 |
Dot Net Core 1.0.0 VS 2015 Tools Preview 2 설치 문제 (0) | 2020.11.10 |