在python中对包含数字的字符串列表进行排序

时间:2017-04-19 01:25:42

标签: python string list sorting

所以我有一个字符串路径列表:

x = ['../../scene/temp_5a/458754/1_car.png',
     '../../scene/temp_5a/458754/2_car.png',
     '../../scene/temp_5a/458754/10_car.png',
     '../../scene/temp_5a/458754/15_car.png',
     '../../scene/temp_5a/458754/3_car.png']

我需要按_car前面的数字对其进行排序。有谁知道快速的方法吗?

我目前有这个,但看起来拆分正在获取所有数字。我只想在_car前面找到前面的数字。

def atoi(text):
    return int(text) if text.isdigit() else text

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

x.sort(key=natural_keys) # gives an error

4 个答案:

答案 0 :(得分:1)

我的方法是拆分字符串并使用_car前面的数字作为key进行比较。

>>> x = [
...     '../../scene/temp_5a/458754/1_car.png',
...     '../../scene/temp_5a/458754/2_car.png',
...     '../../scene/temp_5a/458754/10_car.png',
...     '../../scene/temp_5a/458754/15_car.png',
...     '../../scene/temp_5a/458754/3_car.png']
>>>
>>> sorted(x,key=lambda i: int(i.split('/')[-1].split('_')[0]))
[[1, '../../scene/temp_5a/458754/1_car.png'], [2, '../../scene/temp_5a/458754/2_car.png'], [3, '../../scene/temp_5a/458754/3_car.png'], [10, '../../scene/temp_5a/458754/10_car.png'], [15, '../../scene/temp_5a/458754/15_car.png']]

答案 1 :(得分:1)

x = ['../../scene/temp_5a/458754/1_car.png',
'../../scene/temp_5a/458754/2_car.png',
'../../scene/temp_5a/458754/10_car.png',
'../../scene/temp_5a/458754/15_car.png',
'../../scene/temp_5a/458754/3_car.png']
sorted(x,key=lambda x: int(x.split('/')[-1].split('_car')[0]))

Out[118]: 
['../../scene/temp_5a/458754/1_car.png',
 '../../scene/temp_5a/458754/2_car.png',
 '../../scene/temp_5a/458754/3_car.png',
 '../../scene/temp_5a/458754/10_car.png',
 '../../scene/temp_5a/458754/15_car.png']

答案 2 :(得分:1)

我不确定为什么你的正则表达式给了你一个错误,它对我有用。也许尝试不同的正则表达式?

x = ['../../scene/temp_5a/458754/1_car.png', '../../scene/temp_5a/458754/2_car.png', '../../scene/temp_5a/458754/10_car.png', '../../scene/temp_5a/458754/15_car.png', '../../scene/temp_5a/458754/3_car.png'] def atoi(text): return int(text) if text.isdigit() else text def natural_keys(text): return [ atoi(c) for c in re.split(r'.*\/([^_]*)_.*', text) ] x.sort(key=natural_keys) print x 取代你的作品可能也有效:

['../../scene/temp_5a/458754/1_car.png',  
'../../scene/temp_5a/458754/2_car.png', 
'../../scene/temp_5a/458754/3_car.png', 
'../../scene/temp_5a/458754/10_car.png', 
'../../scene/temp_5a/458754/15_car.png']

输出:

option1.matches("[xXyY]")

答案 3 :(得分:1)

字符串匹配是正则表达式的作用。需要很少的正则表达式。

import re

x = ['../../scene/temp_5a/458754/1_car.png',
     '../../scene/temp_5a/458754/2_car.png',
     '../../scene/temp_5a/458754/10_car.png',
     '../../scene/temp_5a/458754/15_car.png',
     '../../scene/temp_5a/458754/3_car.png']


def file_matcher(files):
    numbers = []
    for f in files:
        match = re.search(r'([0-9]+)_car.png', f)
        numbers.append(match.group(1))
    return numbers

print file_matcher(x)