Удалить элемент из объединенного списка, а также удалить из исходного списка - python - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть два списка

>>> 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, есть ли способ удалить элемент из объединенного списка и также повлиять на исходный список?

Мой текущий способ - просто проверить исходный список игроков, а затем оригинальный список зрителей, но, похоже, должен быть более Pythoni c способ сделать это

Ответы [ 4 ]

2 голосов
/ 13 апреля 2020

Использование 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']
1 голос
/ 13 апреля 2020

Для меня лучший способ сделать это - создать список списков и выполнить итерацию, чтобы удалить игрока. Это повлияет как на ваш вложенный список, так и на оригинал.

Давайте посмотрим код ниже.

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

Надеюсь, это поможет! :)

1 голос
/ 13 апреля 2020

Это возможно, но только если вы измените на месте один из списков. Как только вы добавите один список в другой, это создаст новый список, и изменения в этом новом списке не будут отражены в исходном списке. В этом смысле вы ничего не можете сделать здесь, так как вызов __add__ всегда создаст копию.

Чтобы изменить ее на месте, вы можете сделать следующее:

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

id(players)
# 112230613128

Сейчас extend с viewers и remove 'b':

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

И вы увидите, что обновленный список все еще остается оригинальным:

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

id(players)
# 112230613128
1 голос
/ 13 апреля 2020

players + viewers это создает новый список, и вы удаляете его из этого нового списка.

Нет ничего действительно «unpythoni c», когда у вас есть две структуры данных для выполнения операций над каждой из них.

Если вы хотите сделать это за одну операцию, вы можете обернуть players и viewers в классе и иметь метод remove для этого класса, который затем будет удален как из игроков, так и из зрителей, таким образом, вы бы скрыли эту «уродливую» операцию. Но я думаю, что это не стоит того.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...