无法对最后一行字符串上的多行进行排序

时间:2014-08-06 12:04:07

标签: python sorting

简介

跟进this Q&A

目标:对最后一个字符串

排序多行

方式

已创建一个示例文件来测试最后一个String上多行的排序。

示例

aa - http://gggggggggg
bb - http://bbbbbbbbbb
cc - http://aaaaaaaaaa
aa - http://cccccccccc
bb - http://bbbbbbbbbb
cc - http://iiiiiiiiii
bb - http://bbbbbbbbbb
aa - http://ffffffffff
bb - http://bbbbbbbbbb

代码

fp = "C:\\sample.txt"
fp2 = "C:\\sample2.txt"

with open(fp, "r+") as f:
    lines = f.readlines()
    lines.sort()
    print(lines)

with open(fp2, "r+") as f2:
    f2.write("\n".join(lines))

结果

排序基于第一个字符串,而不是后者

电流

aa - http://cccccccccc

aa - http://ffffffffff

aa - http://gggggggggg

bb - http://bbbbbbbbbb
bb - http://bbbbbbbbbb

bb - http://bbbbbbbbbb

bb - http://bbbbbbbbbb

cc - http://aaaaaaaaaa

cc - http://iiiiiiiiii

预期

cc - http://aaaaaaaaaa

bb - http://bbbbbbbbbb
bb - http://bbbbbbbbbb

bb - http://bbbbbbbbbb

bb - http://bbbbbbbbbb


aa - http://cccccccccc

aa - http://ffffffffff

aa - http://gggggggggg

cc - http://iiiiiiiiii 

3 个答案:

答案 0 :(得分:4)

lines.sort(key= lambda x:x.split()[-1]) # sort on last item of each string

例如:

In [11]: s ="cc - http://iiiiiiiiii "

In [12]: s.split()
Out[12]: ['cc', '-', 'http://iiiiiiiiii']  # this is what x:x.split()[-1] is doing each time

我还会使用with open(fp, "r+") as fwith open(fp2, "r+")as f1来打开您的文件,它会自动关闭它们。

答案 1 :(得分:1)

Use the key parameter指定要排序的代理值。在这种情况下,您可以拆分'-',并颠倒子串的顺序:

fp = "C:\\sample.txt"
fp2 = "C:\\sample2.txt"

with open(fp, "r+") as f, open(fp2, "r+") as f2:
    lines = sorted(f, key=lambda text: text.split('-', 1)[::-1])
    print(lines)
    f2.write("\n".join(lines))

答案 2 :(得分:0)

答案是一个叫做“装饰,排序,不装饰”的成语。"

循环你的行,并为每一行创建一个"最后一个字符串","完整行"。

对元组列表进行排序。

仅返回"完整的行"每个元组的一部分。

示例:

fp = "C:\\sample.txt"
fp2 = "C:\\sample2.txt"

with open(fp, "r+") as f:
    lines = f.readlines()
    line_tuples = [(i.split()[-1], i) for i in lines]
    line_tuples.sort()
    lines = [i[-1] for i in line_tuples]
    print(lines)

with open(fp2, "r+") as f2:
    f2.write("\n".join(lines))

line_tuples.sort()两侧的两个列表推导可能难以理解,因为它们在如此短的空间内做了很多。第一个基本上是对lines中的每个字符串说'#34;',在line_tuples中创建一个匹配的元组,它始于字符串的最后一个字。"字符串的最后一个单词成为下一行中的排序键。然后第二个列表理解说"浏览所有这些元组,只提取原始行,然后将它们放回lists。"

请注意,此代码应该有效,但我目前无法访问使用Python的计算机,因此我无法保证。