2016-09-15 5 views
0

날짜순으로 정렬 된 목록에 게시물이 있습니다.파이썬 목록을 여러 목록으로 나눠서 각 목록을 따로 따로 섞습니다.

3 개의 그룹으로 나눠서 목록에있는 항목을 적절히 섞으 려합니다.

chunks = [posts[x:x+2] for x in xrange(0, len(posts), 2)] 

이제 덩어리가 반환됩니다

[[<Post: 6>, <Post: 5>], [<Post: 4>, <Post: 3>], [<Post: 2>, <Post: 1>]] 

무작위로 각 해당 목록 내부에 이러한 항목을 셔플 몇 가지 효율적인 방법은 무엇입니까?

[[<Post: 5>, <Post: 6>], [<Post: 4>, <Post: 3>], [<Post: 1>, <Post: 2>]] 

이상 :

[<Post: 5>, <Post: 6>, <Post: 4>, <Post: 3>, <Post: 1>, <Post: 2>] 

답변

1

내가 최종 출력이 같은 것을보고 싶지 ... 나는 그들을 통해 반복 각 해당 목록을 만드는 생각할 수 있지만, 이것은 반복적 인 것 같습니다

물론입니다. random.shuffle이 제자리에서 작동하므로 목록 요소를 반복하고이를 적용하면 첫 번째 작업이 수행됩니다. "flattening"의 경우 즐겨 찾는 트릭을 사용합니다. 시작 요소가 빈 목록 인 하위 목록에 sum을 적용합니다.

import random,itertools 

chunks = [["Post: 6", "Post: 5"], ["Post: 4", "Post: 3"], ["Post: 2", "Post: 1"]] 

# shuffle 

for c in chunks: random.shuffle(c) 

# there you already have your list of lists with shuffled sub-lists 
# now the flattening 

print(sum(chunks,[]))     # or (more complex but faster below) 
print(list(itertools.chain(*chunks))) # faster than sum on big lists 

어떤 결과 :

['Post: 5', 'Post: 6', 'Post: 4', 'Post: 3', 'Post: 2', 'Post: 1'] 
['Post: 6', 'Post: 5', 'Post: 3', 'Post: 4', 'Post: 1', 'Post: 2'] 

(당신은 당신이 목록에서 [[<Post: 5>, <Post: 6>, <Post: 4>, <Post: 3>, <Post: 1>, <Post: 2>]] (목록 같은 것을 원했다)하지만 난 그 오타입니다 가정합니다. 나는 간단한 목록을 평평하게 제공

+0

당신 그렇습니다. 오타 & 솔루션이 잘 작동합니다. 감사합니다! –

+0

'sum'은 시퀀스를 연결하기위한 것이 아니며, 각 단계마다 새로운 시퀀스를 생성하므로 많은 수의 복사와 임시 작업이 필요합니다. 시퀀스를 효율적으로 연결하려면 , itertools.chain을 사용하여 (생성기로부터 새로운'list'를 생성하기 위해'list'를 감싸는'list'를 포함하고 있습니다. 'itertools import chain'에서'print (list (chain (* chunk)))'를 호출합니다. 반복되는 문자열 연결과'' '.join' 사용의 차이점입니다. – ShadowRanger

+0

@ShadowRanger : 감사합니다. 나는 정말로 itertools에 잠수해야한다. 목록 성장률이 문자열 증가율보다 훨씬 낫지 만 당신이 맞습니다. 목록은 크기가 조정되도록 설계되었습니다. 예를 들어,'sum'은 문자열을 구성하는 것을 피하기 위해 보호되어 있습니다 :'sum ("abcdef", "")'당신이'TypeError를 얻으려고한다면 : sum() 문자열을 합칠 수 없다 [use ''.join (seq) 대신에] –