从联接列表中删除元素,也从原始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的方法来完成

使用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']

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

当您有两个数据结构来对每个数据结构执行操作时,并没有什么真正的"不同步"。

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

这是可能的,但前提是您在其中一个列表中修改。一旦一个列表添加到另一个列表,就会创建一个新列表,并且该列表上的更改将不会反映在原始列表中。从这个意义上说,这里没有什么可以做的,因为调用__add__总是会创建一个副本。

为了在适当的位置修改它,您可以执行以下操作:

players = ['a', 'b', 'c'] 
viewers = ['d', 'e', 'f'] 
id(players)
# 112230613128

现在extendviewersremove'b':

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

你会看到更新后的列表仍然是原来的:

players
# ['a', 'c', 'd', 'e', 'f']
id(players)
# 112230613128

对我来说,最好的方法是创建一个列表列表并迭代以删除一个播放器。这将影响嵌套列表和原始列表。

让我们看看下面的代码。

# Establish the lists
>>> players = ['a', 'b', 'c'] 
>>> viewers = ['d', 'e', 'f']
# Create nested list
>>> participants = [players, viewers]
>>> participants
[['a', 'b', 'c'], ['d', 'e', 'f']] 
# Define the player that left the game (can be assigned however)
>>> player_left = 'a'
# List comprehension to remove the player from the nested list structure
participants = [l.remove(player_left) if player_left in l else l for l in participants]
# See the result
>>> participants
[['b', 'c'], ['d', 'e', 'f']]
# And we can see that this has, in-fact, updated the original list
>>> players
['b', 'c']

希望这能有所帮助!:(

相关内容

最新更新