2011-04-23 7 views
6

목록 이해에서 random.shuffle과 같은 반환 값이없는 메서드를 사용하는 방법이 있습니까? 목록의 각 요소에 반환 값이없는 메서드 적용

>>> import pprint 
>>> import random 
>>> 
>>> L = [ random.shuffle(range(5)) for x in range(5)] 
>>> 
>>> print L 
[None, None, None, None, None] 

내 목록의 각 항목에 random.shuffle 방법을 적용 for 루프 :

>>> L = [ range(5) for x in range(5) ] 
>>> pprint.pprint(L) 
[[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4]] 
>>> for element in L: 
...  random.shuffle(element) 
... 
>>> pprint.pprint(L) 
[[2, 0, 3, 1, 4], 
[2, 0, 1, 4, 3], 
[4, 1, 3, 0, 2], 
[1, 2, 4, 3, 0], 
[1, 3, 0, 2, 4]] 

나는 부작용으로 원래 목록을 섞어하지만를 반환 맵을 사용할 수 있습니다 None

>>> L = [ range(5) for x in range(5) ] 
>>> pprint.pprint(L) 
[[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4]] 
>>> map(random.shuffle, L) 
[None, None, None, None, None] 
>>> pprint.pprint(L) 
[[3, 0, 4, 1, 2], 
[2, 3, 0, 1, 4], 
[2, 3, 1, 4, 0], 
[4, 2, 0, 3, 1], 
[1, 3, 0, 2, 4]] 

의 목록 셔플과 지능형리스트를 사용처럼 :

012,392을

스택 오버플로에 대한 많은 질문과 답변은 이미 map이나 lc를 부작용으로 사용하는 것이 좋지 않음을 지적합니다. 목록 이해에서 반환 값이없는 메서드를 사용하는 올바른 방법이 있는지 궁금합니다.

은 비 반환 방법을 수있는 유일한 방법을 포장하는 방법을 작성하지 :

>>> def shuffled(L): 
...  ret_val = L[:] 
...  random.shuffle(ret_val) 
...  return ret_val 
... 
>>> L = [ shuffled(range(5)) for x in range(5)] 
>>> pprint.pprint(L) 
[[2, 1, 0, 4, 3], 
[4, 0, 3, 1, 2], 
[4, 2, 3, 0, 1], 
[1, 0, 4, 2, 3], 
[2, 4, 3, 0, 1]] 
>>> 
+0

:

import random L = [range(5) for each in xrange(5)] for each in L: random.shuffle(each) 

[편집]

OTOH 당신이 사용할 수 random.sample() :하지만보다 간결 뭔가를 가고 싶어 목록 이해력! – sjr

+0

관련 : http : // stackoverflow.질문과 대답 5753597/피츠 닉 - 사용하기 -리스트 - 이해를위한 - 단지 - 부작용을 위해서 – delnan

답변

8

없음 - 지능형는 반환 값을 갖는 기능을 사용할 수하기위한 것입니다 목록.

목록 함축지도(), 필터() 및/또는 람다의 사용 을 의지하지 않고리스트를 만드는 간결한 방법을 제공 : 그들의 의미 are defined 방법이 있습니다. 결과 목록 정의 은 이러한 구성을 사용하여 작성된 목록 목록보다 명확한 경향이 있습니다. 각 목록 이해는 표현식 다음에 for 절, , 0 개 이상의 for 또는 if 절로 구성됩니다. 그 결과는 의 결과가되고 if 및 if 절의 컨텍스트에서 표현식을 평가 한 결과가됩니다. .

"읽은 값이없는 함수의 목록 이해"는 모순이라고 분명히 밝혀야합니다.

그냥 "일회성"뭔가에 대한 for 루프를 사용

import random 
L = [] 
for x in range(5): 
    l = range(5) 
    random.shuffle(l) 
    L.append(l) 

깨끗하고 간단합니다. shuffled 함수도 괜찮습니다. 일 수 있습니다.

4

엘리가 옳습니다. 에서 그와 함께 가서, 당신의`shuffled` 방법을 좋아

from random import sample 

xr = xrange(5) 
L = [sample(xr, 5) for each in xr] 
+0

+1 응답과 샘플을 지적 해 주셔서 감사합니다. – DTing

관련 문제