튜플을 목록으로 변환


206

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

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

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


12
튜플을 사용하지 말고 처음부터 목록을 사용하십시오. 레벨이
크면

4
처음부터 튜플 대신 목록을 사용하는 것은 어떻습니까?
Krzysztof Bujniewicz

4
@ user2133308 btw는 단지 호환성 메모, 파이썬 3에서는 부동 소수점 나누기를 수행하고 코드를 망치기 때문에 정수 나누기 //를 사용해야 합니다. //
jamylak

답변:


284

튜플을리스트로 변환 :

>>> 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')

5
이것은 나를 위해 작동하지 않습니다. t를 list ()에 전달하여 튜플 t를 목록으로 변환하기 위해 첫 번째 블록에서 코드를 실행하면 "*** 인수 오류 : '(t)'"오류 메시지가 나타납니다. 디버깅하는 동안에 만 나. 여전히 혼란 스럽습니다.
Jimmy

4
@Jimmy list는 디버거 명령이기 때문에 p list(...)대신 실행하십시오 .
moritz

74

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

[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

2
NumPy는 Python을 사용한 과학 컴퓨팅의 기본 패키지입니다. NumPy의 주요 대상은 동종 다차원 배열입니다. 그것은 양의 정수의 튜플에 의해 색인 된 요소 (보통 숫자), 동일한 유형의 표입니다.
pradyunsg

24

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

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

또는

level1 = map(list, level1)

적절하게 수정하십시오.

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


18

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

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

방법 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 초 ---


14

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

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)

5

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

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

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

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


이 답변을 작성해야 numpy합니다.이 유형의 데이터로 작업하는 가장 빠른 솔루션을 제공합니다.
jamylak

물론 데이터를 조작 할 때에도 튜플과 같은 변경 불가능한 데이터 구조를 사용할 수 있습니다. 함수형 프로그래밍의 전제와 데이터의 지속성을 기반으로하는 모든 것. 그러나 물론 파이썬 땅에서 당신은 대중과 함께 자유롭게 변화하고 싶을 수도 있습니다.
nperson325681

5

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

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)

2

목록 목록 대신 하나의 목록 만 사용하면 작업 속도를 크게 높일 수 있습니다. 이것은 물론 모든 내부 목록의 크기가 동일한 경우에만 가능합니다 (이 예제에서는 그렇기 때문에 이것을 가정합니다).

WIDTH = 6
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[x + y*WIDTH]  # print value at (x,y)

목록 대신 비트 필드를 사용하면 더 빨라질 수 있습니다.

WIDTH = 8  # better align your width to bytes, eases things later
level1 = 0xFC84848484FC  # bit field representation of the level
print "1" if level1 & mask(x, y) else "0"  # print bit at (x, y)
level1 |= mask(x, y)  # set bit at (x, y)
level1 &= ~mask(x, y)  # clear bit at (x, y)

def mask(x, y):
  return 1 << (WIDTH-x + y*WIDTH)

그러나 필드에 0 또는 1이 포함 된 경우에만 작동합니다. 더 많은 값이 필요하면 몇 비트를 결합하여 문제를 훨씬 더 복잡하게 만들어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.