我正在使用Python脚本生成一些Stata命令。输出是一个文本文件。我想使用Python对属于同一观察的行进行分组,目前情况并非如此。
此文件中的典型行(我们称之为file.txt)属于以下类别:
[something something] if a == 1 & b == 2 & c == 3 & [other things]
其中a,b和c是识别变量。 (a,b,c)三元组唯一地标识观察。我想要做的是通过将与同一观察相关的所有行分组在一起来对file.txt进行排序。
例如,请从:
replace k = 1 if a == 1 & b == 2 & c == 3 & comments_1 == "I wish I was better at Python"
replace k = 2 if a == 1 & b == 3 & c == 4 & comments_1 == ""
replace g = "Example" if a == 1 & b == 2 & c == 3 & comments_1 == "I wish I was better at Python"
为:
replace k = 1 if a == 1 & b == 2 & c == 3 & comments_1 == "I wish I was better at Python"
replace g = "Example" if a == 1 & b == 2 & c == 3 & comments_1 == "I wish I was better at Python"
replace k = 2 if a == 1 & b == 3 & c == 4 & comments_1 == ""
输入的第1行和第3行在输出中彼此相邻,因为它们与相同的观察(相同的a,b,c三联体)有关。这与按字母顺序排序不同,因此我不能使用sort()。
我的计划是:
创建一个空字典dict [tuple [int]:set [str]]
阅读文本文件的每一行。对于每一行,通过搜索'a =='之后和'b =='之前的字符来获取三元组,依此类推。
如果三元组在字典中,则将该行添加为三元组指向的集合中的字符串。如果没有,请创建条目并添加字符串。
对于每个条目集合中的每个字符串,在文件中写入字符串。
我相信这会对文件进行排序。
那会有用吗?有没有更好的方法呢?
谢谢!
答案 0 :(得分:0)
听起来不错。您可以使用正则表达式来提取观察结果。例如,假设观察结果由正整数组成,您可以使用:
import re
line = 'replace k = 1 if a == 1 & b == 2 & c == 3 & comments_1 == "test"'
m = re.search(r'a == (\d+) & b == (\d+) & c == (\d+)', line)
observation = tuple(map(int, m.groups()))
print(observation)
这会打印元组(1, 2, 3)
。
答案 1 :(得分:0)
这是一个很好的方法,但是由于你想要保留所有的行,我不会打扰使用相同三元组的行:只需列出所有行并使用它们的值三元组作为排序键进行排序。
def getvalues(line):
"""Extract a value triple from a line that matches the pattern"""
m = re.search(r"if a == (\d+) & b == (\d+) & c == (\d+) &", line)
if m:
return tuple(int(v) for v in m.groups())
else:
return line # Lines that don't match the pattern are sorted normally
with open("file.txt") as fp:
lines = fp.readlines()
lines.sort(key=getvalues)
以上假设所有行都有相同的变量名,空格等。如果没有,你需要详细说明你的正则表达式。