pop/удаление элементов из кортежа python

Я не уверен, что могу ясно выразиться, но попытаюсь.

У меня есть Кортеж в Python, который я прохожу следующим образом (см. код ниже). Проходя через него, я поддерживаю счетчик (назовем его "n") и " pop " элементы, которые отвечают определенному условию.

теперь, конечно, как только я поп первый элемент, нумерация все идет не так, как я могу сделать то, что я хочу сделать более элегантно, удаляя только определенные записи кортежа на лету?

for x in tupleX:
  n=0
  if (condition):
     tupleX.pop(n)
  n=n+1

6 ответов


As DSM упоминает, tupleнеизменяемы, но даже для списков более элегантным решением является использование filter:

tupleX = filter(str.isdigit, tupleX)

или, если condition не является функцией, используйте понимание:

tupleX = [x for x in tupleX if x > 5]

если вам действительно нужен tupleX, чтобы быть кортежем, используйте выражение генератора и передайте это tuple:

tupleX = tuple(x for x in tupleX if condition)

хорошо, я придумал грубый способ сделать это.

Я сохраняю значение " n " в цикле for, когда условие выполняется в списке (назовем его delList), затем сделайте следующее:

    for ii in sorted(delList, reverse=True):
    tupleX.pop(ii)

любые другие предложения также приветствуются.


может быть, вы хотите словари?

d = dict( (i,value) for i,value in enumerate(tple))
while d:
    bla bla bla
    del b[x]

есть простое, но практичное решение.

Как сказал DSM, кортежи неизменяемы, но мы знаем, что списки изменчивы. Поэтому, если вы измените Кортеж на список, он будет изменяемым. Затем вы можете удалить элементы по условию, а затем после изменения типа на кортеж снова. Вот и все.

пожалуйста, посмотрите на коды ниже:

tuplex = list(tuplex)
for x in tuplex:
  if (condition):
     tuplex.pop(tuplex.index(x))
tuplex = tuple(tuplex)
print(tuplex)

например, следующая процедура удалит все четные числа из данного кортежа.

tuplex = (1, 2, 3, 4, 5, 6, 7, 8, 9)
tuplex = list(tuplex)
for x in tuplex:
  if (x % 2 == 0):
     tuplex.pop(tuplex.index(x))
tuplex = tuple(tuplex)
print(tuplex)

Если вы испытываете тип последнего tuplex, вы найдете это кортеж.

наконец, если вы хотите определить счетчик индекса, как вы это сделали (т. е. n), вы должны инициализировать его перед циклом, а не в цикле.


Да, мы можем сделать это. Сначала преобразуйте Кортеж в список, затем удалите элемент в списке после этого снова преобразуйте обратно в кортеж.

демо:

my_tuple = (10, 20, 30, 40, 50)

# converting the tuple to the list
my_list = list(my_tuple)
print my_list  # output: [10, 20, 30, 40, 50]

# Here i wanna delete second element "20"
my_list.pop(1) # output: [10, 30, 40, 50]
# As you aware that pop(1) indicates second position

# Here i wanna remove the element "50"
my_list.remove(50) # output: [10, 30, 40]

# again converting the my_list back to my_tuple
my_tuple = tuple(my_list)


print my_tuple # output: (10, 30, 40)

спасибо


кортеж объявляется неизменной.

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

tupleX = tuple( [ e for e in list( tupleX ) if not condition( e ) ] )

это сохраняет элементы, которые не соответствуют условию, а не выскакивают из кортежа/списка.

но если вы намерены сделать это так же, как и свой собственный путь, вы должны сделать свой кортеж список заранее sth как listX = list( tupleX ). вам лучше добавить индекс нежелательных материалов внутри итерации в список ( unwanted_list) и повторить unwanted_list и pop ele в исходном списке. затем сделайте это обратно в кортеж, как tuple( listX )