programing

왜 무작위로.셔플 리턴 없음?

lastcode 2023. 5. 17. 23:14
반응형

왜 무작위로.셔플 리턴 없음?

이유는random.shuffle돌아오는None파이썬에서?

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> print shuffle(x)
None

어떻게 하면 대신 셔플된 값을 얻을 수 있습니까?None?

random.shuffle() 를 변경합니다.x제자리에 나열합니다.

인플레이스 구조를 변경하는 Python API 메서드는 일반적으로 반환됩니다.None수정된 데이터 구조가 아닙니다.

>>> x = ['foo', 'bar', 'black', 'sheep']
>>> random.shuffle(x)
>>> x
['black', 'bar', 'sheep', 'foo']

기존 목록을 순서대로 유지하는 기존 목록을 기반으로 랜덤하게 섞이는 새 목록을 생성하려면 입력의 전체 길이와 함께 사용할 수 있습니다.

random.sample(x, len(x))     

정렬 키에 와 함께 사용할 수도 있습니다.

shuffled = sorted(x, key=lambda k: random.random())

그러나 이것은 정렬(O(N 로그 N) 연산을 호출하는 반면, 입력 길이로 샘플링하는 것은 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))

왜, 정말?

효율성

shuffle목록을 수정합니다.원본 목록이 더 이상 필요하지 않은 경우 큰 목록을 복사하는 것은 순수한 오버헤드이기 때문에 이 방법이 좋습니다.

피톤체

"명시적인 것이 암시적인 것보다 낫다"는 피톤체 스타일의 원칙에 따르면, 목록을 반환하는 것은 나쁜 생각일 것입니다. 왜냐하면 사람들은 그것이 사실은 그렇지 않지만 새로운 것이라고 생각할 수 있기 때문입니다.

하지만 이런 건 싫어요!

만약 당신이 새로운 목록이 필요하다면, 당신은 다음과 같은 것을 써야 할 것입니다.

new_x = list(x)  # make a copy
random.shuffle(new_x)

아주 명백한 것입니다.만약 당신이 이 관용구가 자주 필요하다면, 그것을 함수로 포장하세요.shuffled(참조)sorted) 되돌아오는 것new_x.

문서에 따르면:

순서 x를 제자리에 섞습니다.선택적 인수 랜덤은 [0.0, 1.0]에서 랜덤 부동 소수점을 반환하는 0-인수 함수이며, 기본적으로 이 함수는 랜덤()입니다.

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> shuffle(x)
>>> x
['bar', 'black', 'sheep', 'foo']

저는 이런 컨셉으로 아하 순간을 보냈습니다.

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']

언급URL : https://stackoverflow.com/questions/17649875/why-does-random-shuffle-return-none

반응형