从联接列表中删除元素,并从原始列表中删除

2024-06-01 22:02:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张单子

>>> players = ['a', 'b', 'c'] 
>>> viewers = ['d', 'e', 'f'] 

现在,参与者“b”将退出游戏。我不知道参与者是玩家还是观众,所以我加入了列表:

>>> participants = players + viewers
>>> participants
['a', 'b', 'c', 'd', 'e', 'f']

然后从关联列表中删除“b”:

>>> participants.remove['b']
>>> participants
['a', 'c', 'd', 'e', 'f']

但是,“b”并没有从原始列表中删除:

>>> players
['a', 'b', 'c']

我理解这是预期的行为

我的问题是,在Python中,有没有一种方法可以从连接列表中删除元素,同时影响原始列表

我目前的解决方法只是检查原始的玩家列表,然后是原始的观众列表,但这似乎应该有一种更具python风格的方法来做到这一点


Tags: 方法游戏元素列表风格玩家参与者remove
3条回答

players + viewers这将创建一个新列表,您将从该新列表中删除

当您有两个数据结构对它们中的每一个执行操作时,没有什么是真正的“非音速”的

如果您想在单个操作中完成此操作,您可以将playersviewers包装在一个类中,并在该类上有一个remove方法,该方法将从播放器和查看器中删除,这样您就可以隐藏“丑陋”的操作。但我认为这不值得

使用2D阵列可以做到这一点

players = ['a', 'b', 'c']
viewers= ['d', 'e', 'f']
participants = [players,viewers]
print(participants)

# [['a', 'b', 'c'], ['d', 'e', 'f']]

for i in participants:
    try:
        i.remove("a")
    except:
        pass

print(participants) # [['b', 'c'], ['d', 'e', 'f']]
print(players) # ['b', 'c']

这是可能的,但前提是您在适当的位置修改一个列表。只要您一个列表添加到另一个列表,这将创建一个新列表,并且此列表上的更改将不会反映在原始列表上。从这个意义上讲,您在这里无能为力,因为调用__add__将始终创建一个副本

要就地修改,您可以执行以下操作:

players = ['a', 'b', 'c'] 
viewers = ['d', 'e', 'f'] 

id(players)
# 112230613128

现在{}与{}和{}{}一起:

players.extend(viewers)
players.remove('b')

您将看到更新后的列表仍然是原始列表:

players
# ['a', 'c', 'd', 'e', 'f']

id(players)
# 112230613128

相关问题 更多 >