弹出/删除python元组中的项目

时间:2014-02-10 16:36:05

标签: python tuples pop

我不确定我是否能说清楚,但会尝试。

我在python中有一个元组,我按如下方式进行操作(参见下面的代码)。通过它,我维持一个计数器(让我们称之为'n')和'pop'项目符合一定条件。

当然,当我弹出第一个项目时,编号都出错了,我怎样才能更好地完成我想做的事情,同时只删除元组中的某些条目?

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

9 个答案:

答案 0 :(得分:42)

正如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)

答案 1 :(得分:4)

是的,我们可以做到。 首先将元组转换为列表,然后删除列表中的元素,然后再将其转换回元组。

演示:

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)

由于

答案 2 :(得分:3)

也许你想要字典?

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

答案 3 :(得分:3)

好吧,我想出了一种粗暴的做法。

我在列表中满足条件时将“n”值存储在for循环中(让我们称之为delList),然后执行以下操作:

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

欢迎任何其他建议。

答案 4 :(得分:2)

元组被声明为不可替换。

而且你不会在自己的迭代中弹出项目,它会导致错误,因为它会改变列表obj的长度。 但是你可以在列表推导中做到这一点,相反。

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

这会保留与条件不匹配的元素,而不是将其从元组/列表中弹出。

但是如果你打算像你自己的方式那样做,那么你必须事先将你的元组列为listX = list( tupleX )。你最好将迭代中不需要的材料的索引添加到一个列表(unwanted_list)中,然后在原始列表中迭代unwanted_list并弹出ele。然后让它回到tuple( listX )

之类的元组

答案 5 :(得分:1)

有一个简单但实​​用的解决方案。

正如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),你应该在循环之前初始化它,而不是在循环中。

答案 6 :(得分:1)

Python 3 中,这不再是一个问题,而且您真的不想将列表推导式、强制转换、过滤器、函数或 lambda 用于此类事情。

随便用

popped = unpopped[:-1]

记住它是不可变的,所以如果你想改变它,你必须重新分配值

my_tuple = my_tuple[:-1]

示例

>>> foo= 3,5,2,4,78,2,1
>>> foo
(3, 5, 2, 4, 78, 2, 1)
foo[:-1]
(3, 5, 2, 4, 78, 2)

答案 7 :(得分:0)

最好的解决方案是将元组应用于列表理解,但要提取一个 可能有效的项目:

def pop_tuple(tuple, n): return tuple[:n]+tuple[n+1:], tuple[n]

答案 8 :(得分:0)

假设您有一个以元组作为键的dict,例如:labels = {(1,2,0): 'label_1'},您可以按如下所示修改元组键的元素:

formatted_labels = {(elem[0],elem[1]):labels[elem] for elem in labels}

在这里,我们忽略了最后一个元素。