我有各种复杂的列表,例如
lista = [3,4,[5,[1,2],0]
listb = [[3,4],0,[1,5],2]
我需要在顶部列表中找到项目的位置。我的输出将是item,第一个列表的索引:
0 3
1 2
2 2
3 0
4 1
5 2
所以5,1,2在位置3。
在另一个列表中:
0 1
1 2
2 3
3 0
4 0
5 2
子列表的数量可以变化,每个子列表可以具有子列表。
为简化起见,我搜索了带有“,”的任何列表,并将其展平为1个子列表。
我可以有一个单独元素和列表的列表,但是我无法获取索引。我还尝试将单个元素转换为单个项目列表并将其追加,但仍然无法获取子列表的索引。
答案 0 :(得分:0)
您可以使用通过遍历列表项来展平给定列表的功能,并递归展屏(如果它是列表的话)。使用enumerate
函数生成列表索引并将其输出为元组的第二项:
def flatten(l):
return [(n, i) for i, v in enumerate(l) for n, _ in (flatten(v) if isinstance(v, list) else ((v, 0),))]
所以给定:
lista=[3,4,[5,[1,2]],0]
listb=[[3,4],0,[1,5],2]
以下内容:
print(flatten(lista))
print(flatten(listb))
将输出:
[(3, 0), (4, 1), (5, 2), (1, 2), (2, 2), (0, 3)]
[(3, 0), (4, 0), (0, 1), (1, 2), (5, 2), (2, 3)]
,或者如果您希望输出按项目值排序:
print(sorted(flatten(lista)))
print(sorted(flatten(listb)))
将输出:
[(0, 3), (1, 2), (2, 2), (3, 0), (4, 1), (5, 2)]
[(0, 1), (1, 2), (2, 3), (3, 0), (4, 0), (5, 2)]
答案 1 :(得分:0)
您可以使用如下功能:
def find_index(val, lst):
for i, x in enumerate(lst):
if val == x:
return i
elif type(x) is list: # or type(x) not in {float, int}
try:
find_index(val, x)
# matched without error
return i
except ValueError:
# not in list
pass
# not found
raise ValueError('{} is not in the list'.format(val))
这使用enumerate
函数从列表中获取项目及其索引。然后,如果可能,它将直接针对所需值测试每个项目。如果该项目是一个列表,它将以递归方式进行检查。
测试:
lst = [[3, 4], 0, [1, [5]], 2]
for x in range(6):
print x, find_index(x, lst)
# 0 1
# 1 2
# 2 3
# 3 0
# 4 0
# 5 2
如果您希望能够使用任何类型的可迭代对象(而不仅仅是list
),则可以尝试使用这种更通用的代码,但是很难遵循:
def find_index(val, values):
try:
# Search list of items
for i, x in enumerate(values):
try:
find_index(val, x) # any error?
return i # succeeded
except ValueError:
pass
except TypeError:
# not a list, just an item
if values == val:
return 0 # found
# not found
raise ValueError('{} is not in the list'.format(val))