2

所以我有一个高度列表:

heights = [1, 2, 3, 5, 7, 8, 8, 13]

我使用这个函数将每个高度整数值及其索引存储在一个名为 Node 的类的列表中。

def initializeNodes(heights):
    ans = []
    for height in heights:
        ans.append(Node(heights.index(height), height))
    return ans

但我的问题是,因为它们是列表中的两个 8,所以它给了它们在列表中相同的前 8 位置 5:

0 1
1 2
2 3
3 5
4 7
5 8
5 8
7 13

我该如何解决这个问题?谢谢!

4

3 回答 3

6

用于enumerate()生成索引:

def initializeNodes(heights):
    ans = []
    for i, height in enumerate(heights):
        ans.append(Node(i, height))
    return ans

您可以使用列表推导将四行折叠为 1:

def initializeNodes(heights):
    return [Node(i, height) for i, height in enumerate(heights)]
于 2013-07-10T14:55:23.647 回答
1

问题list.index在于它只会返回该项目第一次出现的索引。

>>> heights = [1, 2, 2, 3, 5, 5, 7, 8, 8, 13]
>>> heights.index(2)
1
>>> heights.index(5)
4
>>> heights.index(8)
7

帮助list.index

L.index(value, [start, [stop]]) -> integer -- 返回值的第一个索引。

您可以提供一个不同于0 的startlist.index,以获取重复项的索引:

>>> heights.index(5,heights.index(5)+1) #returns the index of second 5
5

但这非常麻烦,@MartijnPieters 已经提到的更好的解决方案是enumerate

于 2013-07-10T15:05:04.790 回答
0

问题是您正在从值生成索引,为什么不反过来呢?

heights = [1, 2, 3, 5, 7, 8, 8, 13]

def initializeNodes(heights):
    ans = []
    for index in range(len(heights)):
        ans.append(Node(index, heights[index]))
    return ans

这将创建一个从 0 到高度长度的列表,然后将附加索引,然后是该索引处的高度。

于 2013-07-10T15:13:19.963 回答