如何在嵌套列表的每个子列表中指定特定元素的索引?

Posted

技术标签:

【中文标题】如何在嵌套列表的每个子列表中指定特定元素的索引?【英文标题】:How to specify index of specific elements in every sublist of nested list? 【发布时间】:2020-02-28 23:27:29 【问题描述】:

我有几个嵌套列表,它们都是子列表中彼此的排列:

x = [
['a', [['b', 'c', [['e', 'd']]]]],
['a', [['b', [['e', 'd']], 'c']]],
[[['b', 'c', [['e', 'd']]]], 'a'],
['a', [[[['d', 'e']], 'c', 'b']]], 
['a', [['b', [['d', 'e']], 'c']]]
]

我只想选择符合此要求的那些:如果子列表中包含元素“d”或“b”,则该子列表中的索引必须为 0。 所以只在 x 中的列表中

['a', [['b', [['d', 'e']], 'c']]]

必须选择,因为“d”在其子列表中的索引为 0,同时“b”在其子列表中的索引为 0。 我试过这个功能:

def limitation(root, nested):
    result = []
    for i in nested:
        if isinstance(i, list):
            return limitation(root, i)
        else:
            if (i in ['d', 'b']  and nested.index(i) == 0):
                return root
for i in x:
    print(limitation(i, i))

但输出是这样的:

['a', [['b', 'c', [['e', 'd']]]]]
['a', [['b', [['e', 'd']], 'c']]]
[[['b', 'c', [['e', 'd']]]], 'a']
['a', [[[['d', 'e']], 'c', 'b']]]
['a', [['b', [['d', 'e']], 'c']]]

所以它没有考虑到 'd' 和 'b' 在子列表中必须有索引 0。你能帮我解决它吗?

【问题讨论】:

['a', [[[['d', 'e']], 'c', 'b']]], 为什么这无效? 因为在子列表 [[[['d', 'e']], 'c', 'b']] 'b' 没有索引 0,它有索引 2。所以两者'd' 和 'b' 必须有索引 0。这就是为什么这个 ['a', [['b', [['d', 'e']], 'c']]] 是唯一正确的变体 【参考方案1】:

如果sub-list 包含'b' or 'd',则该元素必须位于第一个索引 [0]

x = [
['a', [['b', 'c', [['e', 'd']]]]],
['a', [['b', [['e', 'd']], 'c']]],
[[['b', 'c', [['e', 'd']]]], 'a'],
['a', [[[['d', 'e']], 'c', 'b']]],
['a', [['b', [['d', 'e']], 'c']]]
]


def limitation(nested):
    for index, subelement in enumerate(nested):
        if isinstance(subelement, list):
            if not limitation(subelement):
                return False
        else:
            if subelement in ['d', 'b'] and not index:
                return False
    return True


for element in x:
    if limitation(element):
        print(element)  # ['a', [['b', [['d', 'e']], 'c']]]

【讨论】:

【参考方案2】:

你可以这样做:

x = [
['a', [['b', 'c', [['e', 'd']]]]],
['a', [['b', [['e', 'd']], 'c']]],
[[['b', 'c', [['e', 'd']]]], 'a'],
['a', [[[['d', 'e']], 'c', 'b']]], 
['a', [['b', [['d', 'e']], 'c']]]
]

def is_valid(sub, seen=0):
    if sub[0] in ('b', 'd'):
        if seen == 1:
            # we found 'b' and 'd' at the right positions
            return True
        else:
            # we found the first one of them
            seen = 1

    elif any(item in sub for item in ('b', 'd')):
        # this sublist has 'b' or 'd' in other than first position
        return False

    # still undecided, we check the sublists recursively
    for item in sub:
        if isinstance(item, list):
            return is_valid(item, seen)

[s for s in x if is_valid(s)]
# [['a', [['b', [['d', 'e']], 'c']]]]

【讨论】:

【参考方案3】:

问题是您停止在列表中寻找更多列表,您找到了一个“b”或一个“d”。例如,调用函数为:

limitation(x[0], x[0])

首先它会检查 ['a', [['b', 'c', [['e', 'd']]]]] 中的 'a' 是否是一个列表 -> 它不是一个列表,所以它继续检查它是'b'还是'd' -> 它不是,所以循环转到下一个项目。现在它将检查 [['b', 'c', [['e', 'd']]]] 是否是一个列表 -> 它是,所以它再次调用该函数 ['b', 'c ',[['e','d']]]。现在它将检查'b'是否是一个列表->它不是,所以现在它检查它是'b'还是'd'-它是哪个,所以返回根。它永远不会检查剩余的列表——在这种情况下,包括一个包含“d”而不是零位置的列表。希望这是有道理的。

【讨论】:

以上是关于如何在嵌套列表的每个子列表中指定特定元素的索引?的主要内容,如果未能解决你的问题,请参考以下文章

python 怎么快速获取嵌套列表内的每一个元素?

如何在频道列表中指定语音频道的位置?不和谐.py

Python

如何在 Joomla 控制器中指定视图列表?

从具有特定索引的 python 列表中挑选项目

如何输出分组对象中指定列中所有值的列表