简介
跟进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
答案 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 f
和with 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的计算机,因此我无法保证。