Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从python元组中弹出/删除项_Python_Tuples - Fatal编程技术网

从python元组中弹出/删除项

从python元组中弹出/删除项,python,tuples,Python,Tuples,我不确定我是否能说清楚,但我会努力的 我在python中有一个元组,如下所示(参见下面的代码)。在检查过程中,我维护了一个计数器(我们称之为“n”)和“pop”项,它们满足特定条件 当然,一旦我弹出第一个项目,编号都出错了,我怎么能做我想做的更优雅,同时只删除一个元组的某些项目的飞行 for x in tupleX: n=0 if (condition): tupleX.pop(n) n=n+1 也许你想要字典 d = dict( (i,value) for i,valu

我不确定我是否能说清楚,但我会努力的

我在python中有一个元组,如下所示(参见下面的代码)。在检查过程中,我维护了一个计数器(我们称之为“n”)和“pop”项,它们满足特定条件

当然,一旦我弹出第一个项目,编号都出错了,我怎么能做我想做的更优雅,同时只删除一个元组的某些项目的飞行

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

也许你想要字典

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

好吧,我想出了一个简单的方法

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

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

任何其他建议也欢迎。

正如《DSM》所提到的,
元组是不可变的,但即使对于列表,一个更优雅的解决方案是使用
过滤器

tupleX = filter(str.isdigit, tupleX)
或者,如果
条件
不是函数,则使用理解:

tupleX = [x for x in tupleX if x > 5]
如果确实需要tupleX成为tuple,请使用生成器表达式并将其传递给
tuple

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

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

正如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)
如果您测试最后一个元组的类型,您会发现它是一个元组

最后,如果您想像以前一样定义一个索引计数器(即n),那么应该在循环之前初始化它,而不是在循环中初始化它。

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

演示:


谢谢

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


def pop_元组(元组,n):
返回元组[:n]+元组[n+1:],元组[n]

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

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

在这里,我们忽略最后的元素。

Python3中,这不再是一个问题,您真的不想使用列表理解、强制、过滤器、函数或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)

tuple
s是不可变的,并且没有
pop
方法。你真的在说
列表吗?@DSM在6年前是正确的,但是Python 3允许对元组进行切片,因此可以有效地弹出。不,我必须使用元组,因为它是由一个外部函数提供的,我不能编辑具有太多依赖性的旧层次代码。谢谢,我会试试这个-比我的方法更优雅。供其他人参考,生成器表达式在速度方面是最优的。@Alecg_O:你能为这个说法提供基准吗?事实上,如果
条件
是(未应用的)C函数(如我提供的示例所示),
过滤器
通常更快;生成器表达式必须执行一些python字节码,但不需要创建调用帧(也如我的列表理解示例中所示)。根据,筛选器和生成器解决方案在功能上是相同的-都返回原始filtered by条件的iterable,根据此定义,两者都是常量时间。但是,假设OP需要一个元组作为输出,那么在转换过程中会出现差异。为了证明这一点:将tuple()从生成器中移除,它们都会立即返回,但是tuple()会过滤,并且需要更长的时间,与tupleX的大小成正比。有趣的旁注:我在寻找从tuple中“移除”单个项的最有效方法时看到了这篇文章。虽然这些都是很好的解决方案,但具有讽刺意味的是,“x=list(x);x.remove();x=tuple(x)”比它们中的任何一个都要快:PIt是一种糟糕的方法。您将分配一个列表,执行一个操作,然后分配另一个元组。快速而优雅的方法是创建一个没有元素的新元组
>>> foo= 3,5,2,4,78,2,1
>>> foo
(3, 5, 2, 4, 78, 2, 1)
foo[:-1]
(3, 5, 2, 4, 78, 2)