如何按方括号之间的数字进行数字排序

时间:2018-10-02 13:48:18

标签: python sorting brackets

我有以下情形,其中文本文件具有类似以下输出的内容:

DecodingIndex[ 1]   PresentationIndex[ 2]
DecodingIndex[ 2]   PresentationIndex[ 3]
DecodingIndex[ 3]   PresentationIndex[ 1]
etc...

因为它按顺序显示DecodingIndex中的数字,所以我希望它按PresentationIndex排序。如下所示:

DecodingIndex[ 3]   PresentationIndex[ 1]
DecodingIndex[ 1]   PresentationIndex[ 2]
DecodingIndex[ 2]   PresentationIndex[ 3]

在Python中有一种简单的方法吗?这些数字一路攀升至数万。方括号之间的距离对于小于10的数字始终有一个间隙,然后将其拥抱起来,例如DecodingIndex [32100]

希望如此,感谢您的帮助!

=======

这是我尝试过的: 1)我遍历文件中的每一行并存储到lines []列表中 2)使用以下正则表达式模式re.compile(r'PresentationIndex\[(.*?)\]')遍历lines []列表中的每个项目 3)然后我使用group()从结果中获取匹配项并将这些值存储在新列表中 4)然后我先对列表进行数字排序,方法是先将项目变成一个整数,然后再排序,然后再将其变成一个这样的字符串 5)现在,我遍历该列表,并在其中插入PresentationIndex和方括号 6)使用PresentationIndex的现在排序列表,我遍历每个列表。对于每次迭代,我都会遍历整个输出文本文件以搜索关联的行,并将其附加到最终列表中。这样,我就可以按照想要的顺序获得输出。

我从大约32,000行的文件开始。进行这种操作大约需要3个小时...

2 个答案:

答案 0 :(得分:1)

这可能不是最佳选择,但应该可以解决问题:

import re
from collections import OrderedDict

my_string = '''DecodingIndex[ 1]   PresentationIndex[ 2]
DecodingIndex[ 2]   PresentationIndex[ 3]
DecodingIndex[ 3]   PresentationIndex[ 1]'''

my_list = list(my_string.split("\n"))

my_dict = {}

for x in my_list:
    match = re.search("\[\s*(\d+)\s*\]$", x)
    my_dict[match.group(1)] = x

ordered_dict = OrderedDict(sorted(my_dict.items(), key=lambda t: t[0]))
print(ordered_dict)

对您来说可能很慢的部分正在读取文件?这一切都应该非常快地运行。我从一个字符串开始,假设您可以将文件转换为字符串。我在\n上分割了字符串,但是您也可以直接读取文件,因此每一行都是列表中的一项。

然后我将其循环,并让正则表达式匹配您要排序的数字。将该值设为key中的dict。然后使用collections按键对字典进行排序。全做完了!希望有帮助。

答案 1 :(得分:1)

您可以使用将括号之间的内容提取为If (sourceFolderMail.Subject = destinationFolderMail.Subject) And (sourceFolderMail.EntryID = destinationFolderMail.UserProperties.Find("EntryID2")) Then

的函数在文件上调用sorted()(因为它充当行列表)
key

import re def extract_presentation_index(line): return int(re.search("\[\s*(\d+)\s*\]$", line).group(1)) # alternatively, in your case, you could avoid using a regex with something like def extract_presentation_index(line): return int(line.split('[')[2].partition(']')[0]) with open('/path/to/your/file') as f: sorted_lines = sorted(f, key=extract_presentation_index) print(''.join(sorted_lines), end='') 只是为了避免在末尾添加额外的换行符。