代码之家  ›  专栏  ›  技术社区  ›  Cate

追加和枚举的行为-当追加到列表时,我可以按附加方式以外的顺序返回值吗?

  •  -1
  • Cate  · 技术社区  · 8 年前

    我正在创建一个列表,其中包含一个单独列表中最低三个数字的索引(不包括0-这是knn函数的一部分)。

    x = [0, 6, 9, 8, 7, 2, 5, 3, 4, 1]
    y = []
    
    for index, item in enumerate(x):
        if 0 < item < 4:
            y.append(index)
    print y
    
    Out: [5, 7, 9]
    

    我希望 y 等于 [9, 5, 7] ,但列表将按排序返回。虽然这对于我正在做的事情来说可能没问题,但我如何才能按索引的附加顺序返回索引?

    更新:正如很多人很快指出的那样,我是个白痴,我想问的是,我怎么才能让y等于 [9,5,7] ,而不是按附加顺序返回索引?

    2 回复  |  直到 8 年前
        1
  •  3
  •   BrenBarn    8 年前

    enumerate 从头到尾迭代列表。第一个索引为0。这意味着第一个符合条件的索引是5,然后是7,然后是9。例如,不清楚为什么您认为9是附加的第一项;这是最后一项 x ,因此它将在迭代中最后到达,并在 y .

    如果您希望索引按值的顺序排列,那么仅通过查看索引的现有顺序是无法实现的。您需要以某种方式跟踪实际元素的相对大小。一种可能性是:

    >>> sorted(range(len(x)), key=lambda ix: x[ix])
    [0, 9, 5, 7, 8, 6, 1, 4, 3, 2]
    

    您可以使用 [1:4] 如果您想获得第二到第四大元素:

    >>> sorted(range(len(x)), key=lambda ix: x[ix])[1:4]
    [9, 5, 7]
    
        2
  •  1
  •   sam-pyt    8 年前

    当你这么做的时候

    y.append(index)
    

    您正在列表中添加元素的索引(或位置),因此返回的列表实际上是按照您附加它们的顺序。

    enumerate 返回具有索引和相应元素的元组列表。此外,你的程序返回的唯一方式 [9, 5, 7] 它是否按顺序返回列表中3个最小值的索引。