我有以下情形,其中文本文件具有类似以下输出的内容:
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个小时...
答案 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='')
只是为了避免在末尾添加额外的换行符。