Skip to main content
 首页 » 编程设计

Python:如何使用正则表达式对字典值进行排序

2024年09月03日26unruledboy

我有两个 .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。

See it run here

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']