태플을 목록으로 변환한 후 되돌리기
저는 현재 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
'programing' 카테고리의 다른 글
MySQL에서 정수 및 숫자 열을 PHP에서 정수 및 숫자로 반환하려면 어떻게 해야 합니까? (0) | 2022.09.07 |
---|---|
sql에 두 개의 varchar를 곱하다 (0) | 2022.09.06 |
메서드 시그니처의 Java "패럴"? (0) | 2022.09.06 |
PHPUnit: 아사트Instance Of()가 작동하지 않습니다. (0) | 2022.09.06 |
Axios를 사용하여 폼에서 파일을 게시하는 방법 (0) | 2022.09.06 |