programing

태플을 목록으로 변환한 후 되돌리기

shortcode 2022. 9. 6. 23:56
반응형

태플을 목록으로 변환한 후 되돌리기

저는 현재 pygame에서 타일맵을 사용하여 게임 지도 편집기를 제작하고 있습니다.레벨은 다음과 같은 구조로 블록으로 구성됩니다(단, 훨씬 더 커짐).

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

--- OR --- (고마워 @jamilak)

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 배열이 더 멋집니다.

Python 3.5(PEP 448 -- Additional Unpacking Generalizations)에서는 다음 리터럴 구문을 사용하여 태플을 목록으로 변환할 수 있습니다.

>>> t = (1,2,3)
>>> lst = [*t]
>>> lst
[1, 2, 3]
>>> *lst,  # back to tuple
(1, 2, 3)

목록 이해 기능을 사용하여 튜플의 튜플을 목록으로 변환할 수 있습니다.

>>> 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]
>>> level1_list
[[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]]
>>> *((*row,) for row in level1_list),
((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
True

튜플을 리스트로 변환하는 방법

(해당 질문의 튜플 사이에 콤마가 없습니다.오류 메시지를 방지하기 위해 추가되었습니다.)

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

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

두 가지 답변 모두 좋지만 조언이 있습니다.

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

당신의 경우 yumiro와 같이 데이터를 추출하고 수정한 후 Schoolboy가 준 답변과 유사한 구조의 태플을 만듭니다.

또한 numpy 어레이를 사용하는 것이 좋습니다.

Tuple에 리스트하고 돌아가면 다음과 같이 할 수 있습니다.

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)

목록 대신 하나의 목록만 사용하면 작업 속도를 획기적으로 높일 수 있습니다.물론 모든 내부 리스트의 사이즈가 같은 경우에만 가능합니다(이 예에서는 그렇습니다만, 저는 이것을 상정하고 있습니다).

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만 포함되어 있는 경우에만 작동합니다.더 많은 값이 필요한 경우 여러 비트를 조합해야 하므로 문제가 훨씬 복잡해집니다.

명령 목록을 사용하는 것만으로는 효과가 없었습니다.

태플이 있는 경우 필요한 요소가 있을 때까지 반복하고 그 후에 목록에 추가합니다.또한 요소 레벨로 이동하면 쉽게 변경할 수 있습니다.

입력:

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_as_list=[]
for i in level1:
    inside_list=[]
    for j in i:
        inside_list.append(j)
    level1_as_list.append(inside_list)

print(level1_as_list)enter code here

출력:

[[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]]

언급URL : https://stackoverflow.com/questions/16296643/convert-tuple-to-list-and-back

반응형