如何遍历列表并检索最小值索引,但忽略输出列表中的重复项?

时间:2019-04-06 04:43:53

标签: python python-3.x

我是编程新手。有人可以帮我查询吗?在此先感谢您说我们有一个列表a = [1、2、23、40、15、61、27、8、19、10]。我想遍历上面的列表(第一个和最后一个元素除外)并检索每个元素,并与上一个和下一个元素进行比较,并返回最小值的索引。例如,在上面的列表中,将第二个元素2与1和23进行比较,并检索索引值1(最小值)。然后将23与2和40进行比较,依此类推。通过这样做,我最终得到一个列表,该列表具有重复索引[0,1,4,7,7,7]。正确的输出列表应为[0,1,4,7]。

1 个答案:

答案 0 :(得分:3)

我在这里将set()enumerate()min()一起使用:

from operator import itemgetter

a = [1, 2, 23, 40, 15, 61, 27, 8, 19, 10]

result = set(
    map(
        itemgetter(1),
        (
            min((a[i - 1], i - 1), (e, i), (a[i + 1], i + 1))
            for i, e in enumerate(a[1:-1], start=1)
        ),
    )
)

print(result)
# {0, 1, 4, 7}

首先存储(最小,索引)对,然后以map()operator.itemgetter()作为最后的索引。

您还可以只使用简单的列表理解:

result = set(
    x[1]
    for x in (
        min((a[i - 1], i - 1), (e, i), (a[i + 1], i + 1))
        for i, e in enumerate(a[1:-1], start=1)
    )
)

或者甚至只用花括号设置语法:

result = {
    x[1]
    for x in (
        min((a[i - 1], i - 1), (e, i), (a[i + 1], i + 1))
        for i, e in enumerate(a[1:-1], start=1)
    )
}

如果希望将列表作为最终输出,则可以将list()包装在最终结果上:

print(list(result))
# [0, 1, 4, 7]