Pop/удалить элементы из кортежа python

Я не уверен, могу ли я проясниться, но попробую.

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

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

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

Ответ 1

ok Я понял грубый способ сделать это.

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

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

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

Ответ 2

Как отмечают 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)

Ответ 3

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

Демо:

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)

Спасибо

Ответ 4

Возможно, вам нужны словари?

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

Ответ 5

Существует простое, но практичное решение.

Как сказал 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), вы должны инициализировать его перед циклом, а не в цикле.