如何遍历列表并检索最小值的索引但忽略输出列表中的重复项?
Posted
技术标签:
【中文标题】如何遍历列表并检索最小值的索引但忽略输出列表中的重复项?【英文标题】:How to loop through a list and retrieve indices of minimum values but ignore the duplicate in the output list? 【发布时间】:2019-04-06 04:43:53 【问题描述】:我是编程新手。有人可以帮我查询吗?提前谢谢假设我们有一个列表 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
3
的索引是怎样的呢?你能更清楚地回顾一下你的逻辑吗?此外,如果您有任何我们可以借鉴的尝试,那就太好了。
您在正确的轨道上解决您的问题。解决问题的最快方法是使用集合而不是列表。集合不能有重复,所以你只会得到唯一的值
对不起 - 我已经编辑了所需的输出列表。
【参考方案1】:
我会在这里使用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
首先存储 (min, index) 对,然后在末尾使用 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]
【讨论】:
@BiLAL 不用担心。如果您喜欢这个答案,请务必将其标记为正确。以上是关于如何遍历列表并检索最小值的索引但忽略输出列表中的重复项?的主要内容,如果未能解决你的问题,请参考以下文章