2017-11-25 133 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个最小值的索引。

相关问题