파이썬 행렬 랜덤 섞기 질문입니다.

조회수 1627회
import random
A = [[0, 1, 2, 3, 4, 5],
     [1, 0, 3, 4, 5, 6],
     [2, 3, 0, 5, 6, 7],
     [3, 4, 5, 0, 7, 8],
     [4, 5, 6, 7, 0, 9],
     [5, 6, 7, 8, 9, 0]]

new_order = random.shuffle(A)
A[:] = [A[i] for i in new_order]
for row in A:
    row[:] = [row[i] for i in new_order]
    print row

new_order를 저렇게 shuffle을 이용해서 무작위로 섞이게 만들고 싶은데 "TypeError: 'NoneType' object is not iterable"이렇게 에러가 발생됩니다. 어떻게 해야할까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 각 행마다 섞어야 하나요? 아니면 전체 항목이 섞여야 된다는 말인가요? 정영훈 2018.9.12 03:41
  • 전체 항목을 섞으려고 합니다. 알 수 없는 사용자 2018.9.12 11:46

2 답변

  • import random
    A = [[0, 1, 2, 3, 4, 5],
         [1, 0, 3, 4, 5, 6],
         [2, 3, 0, 5, 6, 7],
         [3, 4, 5, 0, 7, 8],
         [4, 5, 6, 7, 0, 9],
         [5, 6, 7, 8, 9, 0]]
    map(random.shuffle, A)         # python 3 :list(map(random.shuffle, A))
    print A                        # python 3: print(A)    
    
    
    [[1, 2, 5, 4, 0, 3], [6, 3, 5, 1, 0, 4], [2, 3, 0, 7, 5, 6], [0, 4, 7, 3, 5, 8], [5, 6, 4, 0, 7, 9], [0, 5, 6, 8, 7, 9]]    
    
    import random
    from itertools import chain
    
    A = [[0, 1, 2, 3, 4, 5],
         [1, 0, 3, 4, 5, 6],
         [2, 3, 0, 5, 6, 7],
         [3, 4, 5, 0, 7, 8],
         [4, 5, 6, 7, 0, 9],
         [5, 6, 7, 8, 9, 0]]
    
    flattenA = list(chain(*A))
    random.shuffle(flattenA)
    print flattenA         # python 3: print(flattenA)
    
    [6, 0, 0, 5, 5, 5, 9, 0, 4, 4, 8, 8, 3, 2, 6, 4, 9, 3, 5, 0, 4, 5, 2, 3, 1, 7, 3, 7, 1, 6, 0, 5, 0, 7, 7, 6]
    
    • 감사합니다. 질문에는 안적었지만 대각선은 0을 유지해야하는데 이럴경우 각행을 랜덤으로 돌려야할까요? 알 수 없는 사용자 2018.9.12 11:48
    • 0은 작업 리스트에서 빼고 셔플뒤에 0을 삽입하면 됩니다. 즉 0, 7, 14, 21, 28, 35 에 0을 삽입해주면 됩니다. 정영훈 2018.9.12 12:24
  • 0은 작업 리스트에서 빼고 셔플뒤에 0을 삽입하면 됩니다. 즉 0, 7, 14, 21, 28, 35 에 0을 삽입해주면 됩니다.

    아래와 같이 하면 됩니다.

    import random
    from itertools import chain
    
    A = [[1, 2, 3, 4, 5],
         [1, 3, 4, 5, 6],
         [2, 3, 5, 6, 7],
         [3, 4, 5, 7, 8],
         [4, 5, 6, 7, 9],
         [5, 6, 7, 8, 9]]
    
    flattenA = list(chain(*A))
    random.shuffle(flattenA)
    for i in (0, 7, 14, 21, 28, 35): flattenA.insert(i, 0)
    print flattenA         # python 3: print(flattenA)
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)