查找列表索引,其中该列表是较大列表的一部分

时间:2019-03-08 00:02:14

标签: python python-2.7

我有各种复杂的列表,例如

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个子列表。

我可以有一个单独元素和列表的列表,但是我无法获取索引。我还尝试将单个元素转换为单个项目列表并将其追加,但仍然无法获取子列表的索引。

2 个答案:

答案 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))