append和enumerate的行为 - 附加到列表时,我可以按照它们追加的方式以外的顺序返回值吗?
我在一个单独的列表中创建一个包含最低三个数字索引的列表(不包括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]
,而不是按照他们附加的顺序返回索引?
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]
完美地工作 - 谢谢! – Cate
当你做
y.append(index)
要添加在列表中的元素的索引(或位置),所以返回的名单实际上是在其中附加的顺序。
enumerate
返回包含索引和相应元素的元组列表。此外,您的程序返回[9, 5, 7]
的唯一方法是返回列表中按顺序排列的3个最小值的索引。
为什么你希望得到'[9,5,7]' ?你认为你在附加指数的顺序是什么? – BrenBarn
'[9,5,7]'看起来像满足不等式的项目的指数,按相应项目的值排序(项目在索引9处为1,然后在索引5处为2,然后在索引7处为3) 。 – scrpy
啊对不起!大脑故障了一分钟 - 我实际上是在如何返回y,所以IS是按照[9,5,7]'的顺序排列的。为了清晰起见,将编辑 – Cate