【问题标题】:Python list iterationPython列表迭代
【发布时间】:2013-07-10 14:54:10
【问题描述】:

所以我有一个高度列表:

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

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

【问题讨论】:

    标签: python list iteration


    【解决方案1】:

    使用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)]
    

    【讨论】:

    • 这很完美,而且比我想象的要简单得多! lol好久没用python了,忘了怎么用enumerate,傻我
    【解决方案2】:

    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 -- 返回第一个索引 价值。

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

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

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

    【讨论】:

      【解决方案3】:

      问题是您是根据值生成索引,为什么不反过来呢?

      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 到高度长度的列表,然后将附加索引,然后是该索引处的高度。

      【讨论】:

      • 注意,@Martijn Pieters 建议的枚举方式更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      • 2020-08-09
      • 2014-04-26
      • 2017-11-10
      相关资源
      最近更新 更多