code

random.shuffle이 None을 반환하는 이유는 무엇입니까?

codestyles 2020. 11. 10. 08:08
반응형

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

반응형