我知道元组是不可变的。因此,我试图先将元组转换为列表,然后删除该项目。
我的原始元组是('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解决方案。
答案 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]