将元组转换为列表并返回

2025-02-28 08:23:00
admin
原创
70
摘要:问题描述:我目前正在为 pygame 中的一款游戏开发地图编辑器,使用图块地图。该级别由以下结构中的块构成(尽管要大得多):level1 = ( (1,1,1,1,1,1) (1,0,0,0,0,1) (1,0,0,0,0,1) (1,0...

问题描述:

我目前正在为 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

但是由于关卡存储在元组中,我无法更改不同块的值。如何以简单的方式更改关卡中的不同值?


解决方案 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')

解决方案 2:

您有一个元组的元组。

要将每个元组转换为列表:

[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

解决方案 3:

从 Python 3.5(PEP 448--附加解包概括)开始,可以使用以下文字语法将元组转换为列表:

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

解决方案 4:

你可以拥有一个列表的列表。使用以下命令将元组的元组转换为列表的列表:

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

或者

level1 = map(list, level1)

并进行相应的修改。

但是numpy 数组更酷。

解决方案 5:

将元组转换为列表

(给定问题的元组之间缺少逗号,添加逗号是为了防止出现错误消息)

方法 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 秒 ---

解决方案 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)

level1 = list(level1)

print(level1)

level1 = tuple(level1)

print(level1)

解决方案 7:

列表到元组再返回可以按如下方式完成

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)

解决方案 8:

两个答案都很好,但有一点建议:

元组是不可变的,这意味着它们不能被改变。因此,如果你需要操作数据,最好将数据存储在列表中,这将减少不必要的开销。

在您的情况下,将数据提取到一个列表中,如 eumiro 所示,并在修改后创建与 Schoolboy 给出的答案具有类似结构的元组。

还建议使用 numpy 数组是一个更好的选择

解决方案 9:

如果您只使用一个列表而不是一个列表列表,则可以大大加快您的工作速度。当然,只有当您的所有内部列表大小相同时才有可能(这在您的示例中是正确的,所以我只是假设这一点)。

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 时才有效。如果您需要更多值,则必须组合多个位,这会使问题变得更加复杂。

解决方案 10:

仅使用命令列表对我来说不起作用。

如果你有一个元组,只需迭代直到获得所需的元素,然后将其附加到列表中。如果你进入元素级别,你可以轻松更改它。

输入:

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

解决方案 11:

就我而言,我想合并行/ lists

a = ['Tom', 'Dick', 'Harry']
b = ['20', '32', '14']
c = ['foo', 'bar', 'blah']
lines = [list(row) for row in zip(a, b, c)]
lines = [['Tom', '20', 'foo'], ...]
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3194  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1975  
  产品生命周期管理(PLM)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它整合了从产品概念设计到产品退役的全生命周期数据与流程,帮助企业提高效率、降低成本、提升产品质量。以下将详细介绍PLM系统的7个核心功能模块。产品数据管理模块产品数据管理模块是PLM系统的基础与核心。它负责对产品相关的各类数据进行...
plm项目管理软件   0  
  引言PLM(产品生命周期管理)系统在企业运营中扮演着至关重要的角色,尤其是在合规性管理方面。随着全球贸易环境的日益复杂,出口管制法规不断变化且愈发严格,企业面临着巨大的合规挑战。任何违反出口管制规定的行为都可能导致严重的法律后果,包括高额罚款、业务受限甚至刑事处罚。因此,如何利用PLM系统实现有效的合规性管理,成为众多...
国产plm软件排名   0  
  PLM(产品生命周期管理)项目管理旨在通过整合产品从概念设计到退役的全生命周期信息,实现产品创新、提高质量和降低成本。在这一复杂过程中,风险动态监控至关重要。有效的风险监控机制能及时发现潜在问题,提前制定应对策略,确保项目顺利推进。本文将阐述五阶段监控机制,助力PLM项目管理更好地应对风险。项目启动阶段的风险预评估项目...
plm管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用