[python] 튜플을 목록으로 변환

저는 현재 타일 맵을 사용하여 파이 게임 게임 용 맵 편집기에서 작업하고 있습니다. 레벨은 다음 구조의 블록으로 구성됩니다 (훨씬 더 큼).

level1 = (
         (1,1,1,1,1,1)
         (1,0,0,0,0,1)
         (1,0,0,0,0,1)
         (1,0,0,0,0,1)
         (1,0,0,0,0,1)
         (1,1,1,1,1,1))

여기서 “1”은 벽인 블록이고 “0”은 빈 공기 인 블록입니다.

다음 코드는 기본적으로 블록 유형 변경을 처리하는 코드입니다.

clicked = pygame.mouse.get_pressed()
if clicked[0] == 1:
    currLevel[((mousey+cameraY)/60)][((mousex+cameraX)/60)] = 1

그러나 레벨이 튜플에 저장되어 있으므로 다른 블록의 값을 변경할 수 없습니다. 레벨에서 다른 값을 쉽게 변경하는 방법은 무엇입니까?



답변

튜플을리스트로 변환 :

>>> t = ('my', 'name', 'is', 'mr', 'tuple')
>>> t
('my', 'name', 'is', 'mr', 'tuple')
>>> list(t)
['my', 'name', 'is', 'mr', 'tuple']

리스트를 튜플로 변환 :

>>> l = ['my', 'name', 'is', 'mr', 'list']
>>> l
['my', 'name', 'is', 'mr', 'list']
>>> tuple(l)
('my', 'name', 'is', 'mr', 'list')


답변

튜플 튜플이 있습니다.
모든 튜플을 목록으로 변환하려면 :

[list(i) for i in level] # list of lists

— 또는 —

map(list, level)

편집이 끝나면 다시 변환하십시오.

tuple(tuple(i) for i in edited) # tuple of tuples

— 또는 — (감사합니다 @jamylak)

tuple(itertools.imap(tuple, edited))

numpy 배열을 사용할 수도 있습니다.

>>> a = numpy.array(level1)
>>> a
array([[1, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 1],
       [1, 1, 1, 1, 1, 1]])

조작 :

if clicked[0] == 1:
    x = (mousey + cameraY) // 60 # For readability
    y = (mousex + cameraX) // 60 # For readability
    a[x][y] = 1


답변

리스트리스트를 가질 수 있습니다. 다음을 사용하여 튜플 튜플을 목록 목록으로 변환하십시오.

level1 = [list(row) for row in level1]

또는

level1 = map(list, level1)

적절하게 수정하십시오.

그러나 numpy 배열 은 더 시원합니다.


답변

튜플을 목록으로 변환하려면

(주어진 질문에서 튜플 사이에 쉼표가 누락되어 오류 메시지를 방지하기 위해 추가되었습니다)

방법 1 :

level1 = (
     (1,1,1,1,1,1),
     (1,0,0,0,0,1),
     (1,0,0,0,0,1),
     (1,0,0,0,0,1),
     (1,0,0,0,0,1),
     (1,1,1,1,1,1))

level1 = [list(row) for row in level1]

print(level1)

방법 2 :

level1 = map(list,level1)

print(list(level1))

방법 1 소요 — 0.0019991397857666016 초 —

방법 2는 — 0.0010001659393310547 초 —


답변

유형을 튜플에서 목록으로 또는 그 반대로 변환하지 마십시오.

level1 = (
     (1,1,1,1,1,1)
     (1,0,0,0,0,1)
     (1,0,0,0,0,1)
     (1,0,0,0,0,1)
     (1,0,0,0,0,1)
     (1,1,1,1,1,1))

print(level1)

level1 = list(level1)

print(level1)

level1 = tuple(level1)

print(level1)


답변

두 가지 답변 모두 훌륭하지만 약간의 조언이 있습니다.

튜플은 변경할 수 없으므로 변경할 수 없습니다. 따라서 데이터를 조작해야 할 경우 목록에 데이터를 저장하는 것이 좋으며 불필요한 오버 헤드가 줄어 듭니다.

귀하의 경우에는 eumiro로 표시된 것처럼 데이터를 목록으로 추출하고 수정 한 후 Schoolboy가 제공 한 답변과 유사한 구조의 유사한 튜플을 만듭니다.

또한 numpy 배열을 사용하는 것이 더 나은 옵션입니다.


답변

튜플과리스트는 아래와 같이 할 수 있습니다.

import ast, sys
input_str = sys.stdin.read()
input_tuple = ast.literal_eval(input_str)

l = list(input_tuple)
l.append('Python')
#print(l)
tuple_2 = tuple(l)

# Make sure to name the final tuple 'tuple_2'
print(tuple_2)