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

How to get index from a natural sort?

我有一个像

这样的列表
mylist=['foo/2.py','foo/12.py','foo/10.py','foo/1.py','foo/25.py']

我需要得到类似

的索引
[3,2,1,0,4]

How to get indices of a sorted array in Python 问题的答案无效,因为它获得了非自然排序的索引

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)

给予

['foo/2.py', 'foo/12.py', 'foo/10.py', 'foo/1.py', 'foo/25.py']
['foo/1.py', 'foo/2.py', 'foo/10.py', 'foo/12.py', 'foo/25.py']
[0, 2, 3, 1, 4]
['foo/1.py', 'foo/10.py', 'foo/12.py', 'foo/2.py', 'foo/25.py']

这是一种方法。

例如:

mylist=['foo/2.py','foo/12.py','foo/10.py','foo/1.py','foo/25.py']
#print([mylist.index(i) for i in sorted(mylist)])
print([mylist.index(i) for i in sorted(mylist, key=lambda x: re.search(r"(\d+)\.py", x).group(1))])

输出:

[3, 2, 1, 0, 4]

这是另一种方法:

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]

编辑:如果你想按字符串中的数字排序,你可以这样做:

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, 0, 2, 1, 4]

您可以使用natsort包来实现自然排序部分。

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]

要获取按自然顺序排序的索引,您可以将自定义键输入 sorted

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