Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从自然排序中获取索引?_Python_Indexing_Natural Sort - Fatal编程技术网

Python 如何从自然排序中获取索引?

Python 如何从自然排序中获取索引?,python,indexing,natural-sort,Python,Indexing,Natural Sort,我有一张这样的清单 mylist=['foo/2.py','foo/12.py','foo/10.py','foo/1.py','foo/25.py'] 我需要得到这样的索引 [3,2,1,0,4] 问题的答案不起作用,因为它得到了非自然排序的索引 def natural_keys(text): return [ atoi(c) for c in re.split(r'(\d+)', text) ] mylist=['foo/2.py','foo/12.py','foo/10.py

我有一张这样的清单

mylist=['foo/2.py','foo/12.py','foo/10.py','foo/1.py','foo/25.py']
我需要得到这样的索引

[3,2,1,0,4]
问题的答案不起作用,因为它得到了非自然排序的索引

def natural_keys(text):
    return [ atoi(c) for c in re.split(r'(\d+)', text) ]

mylist=['foo/2.py','foo/12.py','foo/10.py','foo/1.py','foo/25.py']
print(mylist)
mylist.sort(key=natural_keys)
print(mylist)
ind=[i[0] for i in sorted(enumerate(mylist), key=lambda x:x[1])]
print(ind)
mylist=[mylist[i] for i in ind]
print(mylist)
给予

这是一种方法

例:

输出:


这是另一种方法:

mylist=['foo/2.py','foo/12.py','foo/10.py','foo/1.py','foo/25.py']

print([i[0] for i in sorted(enumerate(mylist), key=lambda k: k[1])])
印刷品:

[3, 2, 1, 0, 4]
[3, 0, 2, 1, 4]
编辑:如果要在字符串中按数字排序,可以执行以下操作:

mylist=['foo/2.py','foo/12.py','foo/10.py','foo/1.py','foo/25.py']
import re
print([i[0] for i in sorted(enumerate(int(re.findall(r'\d+', v)[0]) for v in mylist), key=lambda k: k[1])])
印刷品:

[3, 2, 1, 0, 4]
[3, 0, 2, 1, 4]
您可以使用包来实现自然排序部分

from natsort import index_natsorted

mylist = ['foo/2.py','foo/12.py','foo/10.py','foo/1.py','foo/25.py']
ind = index_natsorted(mylist)

结果是[3,0,2,1,4]对[3,2,1,0,4]的默认排序。

如果先在列表元素与其位置之间创建映射,则会更容易

>>> mapping = {k:i for i,k in enumerate(mylist)}
>>> [mapping[k] for k in sorted(mylist)]
[3, 2, 1, 0, 4]
要在按自然顺序排序时获取索引,可以输入自定义键以进行排序


为什么在找到ind之前要更改项目的顺序?删除该步骤,这应该可以正常工作。是的!就是这样!谢谢!信不信由你。这是最慢的方法。如果原始列表中有重复的条目,则不会给出正确的结果。实际上,使用直接给出结果。我本来打算用这些信息来回答,但我会让你用这些信息来更新这个答案。作为奖励,使用索引对你可以使用的其他列表进行排序。
>>> mapping = {k:i for i,k in enumerate(mylist)}
>>> [mapping[k] for k in sorted(mylist)]
[3, 2, 1, 0, 4]
>>> import re
>>> [mapping[k] for k in sorted(mylist, key=lambda word: tuple(map(int, re.findall(r'\d+', word))))]
[3, 0, 2, 1, 4]