Python: 确定嵌套元组中的位置

Python: determining location in nested tuple

我想知道你是否可以提供帮助。

我有一个看起来像

的元组
(1,2,(3,4,(5,(6,4),2),1,2))

我想找到所有号码及其位置。 例如,我想要元组中除第一个整数以外的所有整数。我已经写了一个递归脚本来做到这一点,

a=[]
def getNumbers(t):
    for i,item in enumerate(t):
        if type(item) is int:
            if i > 0:
                a.append(item)
        else:
            getNumbers(item)

但我似乎无法确定它们在整个元组中的深度。你能帮忙吗?

您需要在调用递归函数时计算深度,当您使初始调用传递的深度为零时,然后在每次递归调用时 depth + 1

data = (1,2,(3,4,(5,(6,4),2),1,2)) a=[]

def getNumbers(t, depth):
    for i,item in enumerate(t):
        if type(item) is int:
            if i > 0:
                a.append(item)
        else:
            getNumbers(item, depth + 1)

# call passing initial depth of 0.
getNumbers(data, 0)

我会稍微改变一下结构。这是一个解决方案,它为您提供一个字典,将您要查找的项目映射到(嵌套级别,索引)元组,并且不依赖于外部容器:

def findall(tup, which, res=None, nest=0):
    'tup: nested tuple, which: set of items to find'
    if res is None:
        res = {}
    for index, item in enumerate(tup):
        if isinstance(item, tuple):
            findall(item, which, res, nest+1)
        elif item in which:
            res.setdefault(item, []).append((nest, index))
    return res

print(findall((1,2,(3,4,(5,(6,4),2),1,2)), {3,4}))

输出:{3: [(1, 0)], 4: [(1, 1), (3, 1)]}

读取:
3 位于索引 0 处的嵌套级别 1。
4 位于索引 1 处的嵌套级别 1。
4 位于索引 1 的嵌套级别 3。