Python 如何删除元组中元素的第一个实例?

Python 如何删除元组中元素的第一个实例?,python,python-3.x,tuples,Python,Python 3.x,Tuples,例如,我有一个元组: (7, 5, 3, 3, 6, 3, 9) 我只想去掉元组中的第一个数字3,这样它就会变成这样: (7, 5, 3, 6, 3, 9) 我编写的代码使用筛选工具删除3,但它也删除了所有其他3: def takeOut(k, r): newK = tuple(filter(lambda x: x != r, k)) return newK print(takeOut((7, 5, 3, 3, 6, 3, 9), 3)) 这并不像人们想象的那么简单,原因

例如,我有一个元组:

(7, 5, 3, 3, 6, 3, 9)
我只想去掉元组中的第一个数字3,这样它就会变成这样:

(7, 5, 3, 6, 3, 9)
我编写的代码使用筛选工具删除3,但它也删除了所有其他3:

def takeOut(k, r):
    newK = tuple(filter(lambda x: x != r, k))
    return newK

print(takeOut((7, 5, 3, 3, 6, 3, 9), 3))

这并不像人们想象的那么简单,原因是元组是不可变的

一种简单的方法是转换为
列表
,使用
删除
删除第一个实例,然后转换回元组:

t = (7, 5, 3, 3, 6, 3, 9)

t2 = list(t)
t2.remove(3)
tuple(t2)
# (7, 5, 3, 6, 3, 9)
作为一项功能:

def takeOut(k, r):
    k2 = list(k)
    k2.remove(r)
    return tuple(k2)

takeOut((7, 5, 3, 3, 6, 3, 9), 3)
# (7, 5, 3, 6, 3, 9)

元组是不可变的,这实际上不是从元组中“删除对象”

当您删除它时,您将创建一个新的元组。 可能有数百种方法可以解决这个问题

def takeOut(k, r):
    first = True
    newK = []
    for item in k:
       if first and item == r:
           first = False
           continue
       newK.append(item)
    return tuple(newK)

print(takeOut((7, 5, 3, 3, 6, 3, 9), 3))

您可以利用
index
仅返回元素的第一个索引这一事实,并将生成器表达式转换回元组:

>>> tuple(e for i, e in enumerate(k) if i != k.index(3))
(7, 5, 3, 6, 3, 9)
我会选择切片:

def remove_element(seq, element):
    try:
        index = seq.index(element)
        return seq[:index] + seq[index + 1:]
    except ValueError:  # element doesn't exist
        return seq

在Python中,最快也是最简单的方法是尽可能使用任何内置方法。在这种情况下,这将是元组(序列)方法(有关详细信息,请参阅文档中的):


在这种情况下,这样做意味着函数也可以使用
list
s,因为它们也是序列。

我有完全相同的解决方案。我正在检查是否有更快的一个通用解决方案,它将删除所有相似的对,只是第一次出现。。。
def remove_first_inst(seq, elem):
    try:
        i = seq.index(elem)
    except ValueError:
        return seq  # elem was not in sequence.
    return seq[:i] + seq[i+1:]


t = (7, 5, 3, 3, 6, 3, 9)

print(remove_first_inst(t, 3))  # -> (7, 5, 3, 6, 3, 9)