2017-11-25 233 views
-1

我在一個單獨的列表中創建一個包含最低三個數字索引的列表(不包括0--這是knn函數的一部分)。append和enumerate的行爲 - 附加到列表時,我可以按照它們追加的方式以外的順序返回值嗎?

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],而不是按照他們附加的順序返回索引?

+5

爲什麼你希望得到'[9,5,7]' ?你認爲你在附加指數的順序是什麼? – BrenBarn

+0

'[9,5,7]'看起來像滿足不等式的項目的指數,按相應項目的值排序(項目在索引9處爲1,然後在索引5處爲2,然後在索引7處爲3) 。 – scrpy

+0

啊對不起!大腦故障了一分鐘 - 我實際上是在如何返回y,所以IS是按照[9,5,7]'的順序排列的。爲了清晰起見,將編輯 – Cate

回答

3

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] 
+0

完美地工作 - 謝謝! – Cate

1

當你做

y.append(index) 

要添加在列表中的元素的索引(或位置),所以返回的名單實際上是在其中附加的順序。

enumerate返回包含索引和相應元素的元組列表。此外,您的程序返回[9, 5, 7]的唯一方法是返回列表中按順序排列的3個最小值的索引。

相關問題