如何删除元组元组中的项?

时间:2018-03-15 17:42:24

标签: python list tuples

我知道元组是不可变的。因此,我试图先将元组转换为列表,然后删除该项目。

我的原始元组是('monkey', 'camel', ('python', 'elephant', 'penguin'))。它是一个包含内部另一个元组的元组。我想删除'python'

首先我定义了一个flatten()函数(我在论坛上找到了它):

def flatten(foo):
    for x in foo:
        if hasattr(x,'__iter__') and not isinstance(x,str):
            for y in flatten(x):
                yield y
        else:
            yield x

然后定义删除功能:

def tuple_without(original_tuple,item_remove):
    lst=flatten(list(original_tuple))  #  convert the original tuple to list and flatten it
    return list(x for x in lst if x !=item_remove)

print(tuple_without(new_zoo,'python'))

它有效,结果显示为:

['monkey', 'camel', 'elephant', 'penguin']

我想知道这里是否有更好更多的Pythonic解决方案。

4 个答案:

答案 0 :(得分:1)

您可以创建一个递归函数,如下所示

def removeItem(myTuple, item):
     myList = list(myTuple)
     for index, value in enumerate(myList):
         if isinstance(value, tuple):
             myList[index] = removeItem(value, item)
         if value==item:
             del myList[index]
     return myList

这只是遍历元组,将其转换为列表,重新调用自己查找另一个嵌套元组并删除找到的项目。这也保持了嵌套结构,不需要展平!

另外,我刚刚注意到上面的代码实际上并没有使用list(original_tuple)列表中的新列表。相反,它只是扁平化,然后使用元组理解与扁平元组(现在是生成器)的内容制作新元组。因此,在您的示例中,任何时候都没有编辑过列表的内容(只是为了澄清一些事情)。

因此,在lst=flatten(list(original_tuple))行中,您不需要列表功能。

答案 1 :(得分:1)

此代码可以为您完成任务:

def exclude_words(the_tuple, exclude=[]):

    new_list = []

    for value in the_tuple:
        if type(value) == tuple:
            new_list.extend(exclude_words(value, exclude))
        elif not value in exclude:
            new_list.append(value)

    return new_list

答案 2 :(得分:1)

在压平它之前,无需将元组转换为列表。由于这个flatten()版本实际上是所有值的生成器,因此您可以在生成器表达式中使用其结果:

def tuple_without(original_tuple,item_remove):
    return list(x for x in flatten(original_tuple) if x !=item_remove)

您也可以在此处删除list()电话;如果你需要一个列表,那么你可以把它变成你调用这个函数的一个列表,如果你只需要在它上面循环就可以使用返回的生成器表达式。

答案 3 :(得分:0)

循环元组并检查项是否为元组。如果项目不是元组,则将项目附加到列表中。如果该项是一个元组,那么for循环为你想要的项目的元组,并附加到列表中你想要的那个元组。

a = (1,2,(3,4))
b = [ ]

for x in a:
    if type(x) is tuple:
        for y in x:
            if y != 3:
                b.append(y)
    else:
        b.append(x)


print(b)
>>[1,2,4]