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

时间:2018-10-02 23:18:44

标签: 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))

5 个答案:

答案 0 :(得分:6)

之所以没有像人们想象的那样简单,是因为元组是不可变的。

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

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)

答案 1 :(得分:2)

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

>>> tuple(e for i, e in enumerate(k) if i != k.index(3))
(7, 5, 3, 6, 3, 9)

答案 2 :(得分:2)

我要切片:

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

答案 3 :(得分:2)

在Python中执行操作的最快且通常是最简单的方法是尽可能使用它具有的任何内置方法。在这种情况下,这将是元组(序列)方法(有关详细信息,请参见文档中的Common Sequence Operations

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)

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

答案 4 :(得分:0)

字符串是不可变的,实际上并不是从元组中“删除对象”。

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

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