【问题标题】:order raws based on name and number of header python根据标题python的名称和数量订购原始数据
【发布时间】:2021-12-16 02:56:36
【问题描述】:

我有一个 csv 文件,其中包含不同大小的原始数据,其中包含每个原始数据的值和标题。

00_A1_s1
00_A1_s2
00_A1_s3
04_A1_s1
04_A1_s2
04_A1_s3
08_A1_s1
08_A1_s2
08_A1_s3

我想按名称对原始数据进行分组,然后按坐标前面的数字对其进行排序

00_A1_s1
04_A1_s1
08_A1_s1
00_A1_s2
04_A1_s2
08_A1_s2
00_A1_s3
04_A1_s3
08_A1_s3

谢谢!

【问题讨论】:

  • 你能澄清一下“然后按坐标前面的数字排序”吗?您希望第一个订购最后两个字符 sx 然后?

标签: python string csv sorting numbers


【解决方案1】:

您可以将sort 内置函数与key 参数一起使用,该参数接受一个函数,您可以在其中推断元素的顺序条件。它返回一个新列表。

# file names
l = """00_A1_s1
00_A1_s2
00_A1_s3
04_A1_s1
04_A1_s2
04_A1_s3
08_A1_s1
08_A1_s2
08_A1_s3"""

l = l.split('\n') # file names as list

# sort wrt the last group of characters
print(sorted(l, key=lambda p: p.split('_')[-1]))

输出

04_A1_s1
08_A1_s1
00_A1_s2
04_A1_s2
08_A1_s2
00_A1_s3
04_A1_s3
08_A1_s3

【讨论】:

    【解决方案2】:

    您可以使用sorted 和tuple 用于排序顺序中最重要的每个项目,如下所示:

    txt = """00_A1_s1
    00_A1_s2
    00_A1_s3
    04_A1_s1
    04_A1_s2
    04_A1_s3
    08_A1_s1
    08_A1_s2
    08_A1_s3"""
    
    lst = txt.split('\n') 
    
    def orderSort(item):
        splt_itm = item.split('_')
        # first sorting on `A*` then on `s*` and at end consider number
        return (splt_itm[1] , splt_itm[2] , splt_itm[0])
        
    
    result = sorted(lst, key=orderSort)
    print('\n'.join(result))
    

    输出:

    00_A1_s1
    04_A1_s1
    08_A1_s1
    00_A1_s2
    04_A1_s2
    08_A1_s2
    00_A1_s3
    04_A1_s3
    08_A1_s3
    

    【讨论】:

    • ...如果您实现了这样的自定义排序功能,则不需要lambda:sorted(lst, key=orderSort)
    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多