如何在嵌套列表的每个子列表中指定特定元素的索引?
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”而不是零位置的列表。希望这是有道理的。
【讨论】:
以上是关于如何在嵌套列表的每个子列表中指定特定元素的索引?的主要内容,如果未能解决你的问题,请参考以下文章