如何在字符的最后一个实例之后对文本文件进行排序?

How do I sort a text file after the last instance of a character?

目标:根据最后一个斜杠后出现的字符按字母顺序对文本文件进行排序。请注意,在最后一个斜线之前有随机数。

文本文件的内容:

https://www.website.com/1939332/delta.html
https://www.website.com/2237243/alpha.html
https://www.website.com/1242174/zeta.html
https://www.website.com/1839352/charlie.html

期望的输出:

https://www.website.com/2237243/alpha.html
https://www.website.com/1839352/charlie.html
https://www.website.com/1939332/delta.html
https://www.website.com/1242174/zeta.html

代码尝试:

i = 0
for line in open("test.txt").readlines(): #reading text file
    List = line.rsplit('/', 1)            #splits by final slash and gives me 4 lists
    dct = {list[i]:list[i+1]}             #tried to use a dictionary 
    sorted_dict=sorted(dct.items())       #sort the dictionary

textfile = open("test.txt", "w")
for element in sorted_dict:
    textfile.write(element + "\n")
textfile.close()
   

代码无效。

我会将另一个 key 函数传递给 sorted 函数。例如:

with open('test.txt', 'r') as f:
    lines = f.readlines()
    lines = sorted(lines, key=lambda line: line.split('/')[-1])

with open('test.txt', 'w') as f:
    f.writelines(lines)

有关关键功能的更详细说明,请参阅 here

def sortFiles(item):
    return item.split("/")[-1]

FILENAME = "test.txt"

contents = [line for line in open(FILENAME, "r").readlines() if line.strip()]

contents.sort(key=sortFiles)

with open(FILENAME, "w") as outfile:
    outfile.writelines(contents)

在你 运行 这个之前,我假设 you have a newline at the end of your test.txt. 这将解决“合并第二行和第三行”的问题。

如果你真的想用字典:

dct = {}
i=0
with open("test.txt") as textfile:
    for line in textfile.readlines(): 
        mylist = line.rsplit('/',1)
        dct[mylist[i]] = mylist[i+1]

sorted_dict=sorted(dct.items(), key=lambda item: item[1])

with open("test.txt", "w") as textfile:
    for element in sorted_dict:
        textfile.write(element[i] + '/' +element[i+1])

你做错了什么

在第一行中,您将变量命名为 List,在第二行中,您使用 list.

访问它
List = line.rsplit('/', 1)
dct = {list[i]:list[i+1]}

变量名区分大小写,因此您每次都需要使用相同的大写字母。此外,Python 已经有一个 built-in list class。它可以被覆盖,但我不建议将变量命名为 listdict

list[i] 实际上只会生成一个 types.GenericAlias 对象,这是一个类型提示,完全不同于列表,根本不是你想要的。)

你也写了

dct = {list[i]:list[i+1]}

在每个循环迭代中重复创建一个 new 字典,覆盖之前存储在 dct 中的任何内容。您应该改为在循环之前创建一个空字典,并在每次要更新它时为其键分配值,就像我所做的那样。

您在循环的每次迭代中调用 sort;你应该只在循环完成后调用一次。毕竟,您只想对字典进行一次排序。

你还 open 文件两次,虽然你最后关闭了它,但我建议像我一样使用上下文管理器和 with 语句,这样文件关闭是自动处理。


我的代码

sorted(dct.items(), key=lambda item: item[1])

表示 sorted() 函数使用 item 元组(字典项)中的第二个元素作为 'metric' 进行排序的依据。

`textfile.write(element[i] + '/' +element[i+1])` 

是必要的,因为当您执行 rsplit('/',1) 时,您删除了数据中的 /;您需要将它们添加回去并在 write 之前从 element 元组重建字符串。

您不需要 textfile.write 中的 + \n,因为 readlines() 保留了 \n。这就是为什么你应该用换行符结束文本文件:这样你就不必以不同的方式对待最后一行。