我有两个 .txt 文件,它将它们读入字典。我想要一个选项,我可以使用正则表达式从最高到最低对字典中的值(文件中的第三个选项卡)进行排序。
这是我的文件: file1.txt
file Marvel/GuardiansOfGalaxy 300 1
file DC/Batman 504 1
file GameOfThrones 900 0
file DC/Superman 200 1
file Marvel/CaptainAmerica 342 0
文件2.txt
file Science/Biology 200 1
file Math/Calculus 342 0
file Psychology 324 1
file Anthropology 234 0
file Science/Chemistry 444 1
这是假定的输出:
Game of Thrones: 900
DC/Batman: 404
Science/Chemistry: 444
Marvel/CaptainAmerica 342
Math/Calculus 342
...
这是我的代码到目前为止的样子。我无法使用正则表达式根据值(第三个选项卡)以排序方式显示数据。读取功能有效。现在一切都取决于显示排序后的字典:
def read():
pattern = re.compile(r"file\.py (.+).*? (\d+) \d+")
data_files = []
for file in glob.glob("*.txt"):
with open(file, 'r') as filenames:
data_files.append(dict(pattern.findall(filenames.read())))
return data_files
这是我尝试使用 re.findall 和 map(int,) 对字典中的值进行排序的地方,但我得到了 TypeError。我无法确定哪里出了问题。这是我最需要帮助的部分:
def display(data_files):
for lines in data_files:
# print(lines)
pattern_sort = re.findall(r"file\.py (.+).*? (\d+) \d+", data_files)
print(sorted(lines, key=lambda x: (map(int, pattern_sort))))
我希望这是有道理的。谢谢你!
请您参考如下方法:
以下代码是使用字典生成您要求的结果的一种方法。唯一的问题是,由于字典不允许重复键,因此您需要将字典值作为列表(包含重复键值)。
请注意,我必须将制表符更改为 |||,因为 repl.it 不允许我在文件中使用制表符。您必须在下面的脚本中将 ||| 替换为 \t。
import glob
from collections import defaultdict, OrderedDict
d = defaultdict(list)
def read():
for files in glob.glob('*.txt'):
with open(files, 'r') as f:
for line in f:
r = line.rstrip('\n').split('|||')
d[r[2]].append(r)
def display(d):
od = OrderedDict(sorted(d.items(), reverse=True))
for k,v in od.items(): print(k,v)
read()
display(d)
上面脚本的输出如下:
900 [['file', 'GameOfThrones', '900', '0']]
504 [['file', 'DC/Batman', '504', '1']]
444 [['file', 'Science/Chemistry', '444', '1']]
342 [['file', 'Marvel/CaptainAmerica', '342', '0'], ['file', 'Math/Calculus', '342', '0']]
324 [['file', 'Psychology', '324', '1']]
300 [['file', 'Marvel/GuardiansOfGalaxy', '300', '1']]
234 [['file', 'Anthropology', '234', '0']]
200 [['file', 'DC/Superman', '200', '1'], ['file', 'Science/Biology', '200', '1']]
不同的输出
将 print(k,v) 更改为另一种格式会得到不同的输出,正如您在下面的评论中所指出的那样。例如:
print(k, [x[1] for x in v])
结果如下:
900 ['GameOfThrones']
504 ['DC/Batman']
444 ['Science/Chemistry']
342 ['Marvel/CaptainAmerica', 'Math/Calculus']
324 ['Psychology']
300 ['Marvel/GuardiansOfGalaxy']
234 ['Anthropology']
200 ['DC/Superman', 'Science/Biology']
