【问题标题】:Python Sorting Text File From Highest To Lowest Based On Column ValuesPython根据列值从最高到最低对文本文件进行排序
【发布时间】:2012-11-27 03:58:57
【问题描述】:

我有一个非常大的文本文件,其中包含以下数据行:

('#DownWithAssad', '1')
('#DownYoTLParty', '1')
('#Download', '8')
('#Download:', '2')
('#Downloads', '2')
('#DownstairsMixtape', '1')
('#DowntonAbbey', '12')
('#DowntonAbbey?', '1')
('#DowntonPBS', '23')
('#Downtonabbey', '1')
('#DowntownAbbey', '1')

这似乎是一个简单的问题,但我想将数据从最高到最低软化,使其看起来像:

('#DowntonPBS', '23')
('#DowntonAbbey', '12')
('#Download', '8')
('#Download:', '2')
('#Downloads', '2')
('#DownstairsMixtape', '1')
('#DownWithAssad', '1')
('#DownYoTLParty', '1')
('#DowntonAbbey?', '1')
('#Downtonabbey', '1')
('#DowntownAbbey', '1')

我认为我可以消除括号 () 并将数据拆分为:

import sys

f = open(sys.argv[1])
for line in f:
    line = str(line)[1 : -1]
    for sect in line.split(','):
        print sect

但是我不确定从这里去哪里。

【问题讨论】:

    标签: python sorting


    【解决方案1】:

    您可以使用ast.literal_eval 轻松解析您的文本文件:

    with open(datafile) as f:
        file_sorted = sorted((ast.literal_eval(x) for x in f),
                             key=lambda z:(int(z[1]),z[0]),
                             reverse=True)
    

    它是如何工作的:

    (ast.literal_eval(x) for x in f)  #turn each line in your file into a tuple
    key=lambda z:(int(z[1]),z[0])     #function to determine how things are sorted.  Basically
                                      #sort as tuples:  `( int(z[1]),z[0] )`
    reverse=True                      #descending order instead of ascending
    

    【讨论】:

    • 非常感谢,感谢您的解释,我不清楚 key=lambda 做了什么,但我现在明白了。
    【解决方案2】:

    这与您正在尝试做的事情一致。请注意,以这种方式解析行非常脆弱(格式错误的行可能会破坏它)

    from operator import itemgetter
    import sys
    
    result=[]
    with open(sys.argv[1]) as f:
        for line in f:
            line = str(line.strip())[1: -1]
            sect1, sect2 = line.split(', ')
            sect1 = sect1[1: -1]
            sect2 = int(sect2[1: -1])
            result.append((sect1, sect2))
    
    for line in sorted(result, key=itemgetter(1), reverse=True):
        print line
    

    解析它的更好方法是使用literal_eval 或正则表达式。不知道字符串中出现引号字符或逗号是否有特殊处理?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2016-03-19
      • 2014-04-07
      • 2014-06-30
      相关资源
      最近更新 更多