如何在字符串列表中隔离字符串的一部分并使用它对列表进行排序? (在Python中)

时间:2013-12-10 15:22:44

标签: python list sorting

我试图编写一个程序,用Python为我绘制大量图表,我的数据都具有相同的名称格式:

info_scan1.csv,info_scan2.csv,info_scan3.csv等,其中info是每个文件的不同字符串。

我需要成对绘制数据,即在同一个绘图上扫描1和2,扫描3和4,扫描5和6等等。所以我想按{{1}对文件名列表进行排序}' scan'。我该怎么做?

我使用int将所有文件名放在列表中。

干杯。

3 个答案:

答案 0 :(得分:1)

您可以从当前目录中获取所有文件:

files = [x for x in os.listdir('.') if os.path.isfile(x)]

所以files是目录.中的文件名列表。然后你必须按文件名中间的数字对这个列表进行排序,我看到了这个解决方案:

files.sort(key=lambda f: int(re.search("(\d+)", f).group(1)))

这使用文件名中的数字在数字上对就地files列表进行排序。然后你应该在循环中在这个列表中取两个值。 itertools模块有配方,其中一个是'石斑鱼功能:

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *arg)

所以你可以这样做:

>>> for f in grouper(files, 2):
...    print f # f here is a tuple of two files. f[0] is the first and f[1] is the second one
... 
('info_scan1.csv', 'info_scan2.csv')
('info_scan3.csv', 'info_scan4.csv')
('info_scan5.csv', 'info_scan6.csv')
('info_scan7.csv', 'info_scan8.csv')
('info_scan9.csv', 'info_scan12.csv')
('info_scan57.csv', 'info_scan58.csv')

答案 1 :(得分:0)

如果文件名具有相同的数字精度(如果scan09.csv,而不是scan9.csv,则先于scan10.csv),那么简单list.sort()就可以执行此操作。如果没有,那么你想要做的就是“自然排序”:google for python recipes。

答案 2 :(得分:0)

试试这段代码:

name_list = ['_scan1.csv','_scan7.csv','_scan3.csv']

f = lambda s: int(s.replace('.csv','').replace('_scan',''))

sorted(name_list,key = f)
['_scan1.csv', '_scan3.csv', '_scan7.csv']