首页 > 解决方案 > Python:如何使用正则表达式对字典值进行排序

问题描述

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

我希望这是有道理的。谢谢!

标签: pythonregexpython-3.xfiledictionary

解决方案


正如FailSafe所说,没有理由为此使用regex,所以我split改用了。我稍后会regex为这个问题添加一个解决方案,但这里是如何在没有regex.

import glob
from collections import namedtuple

# A lightweight object.
# Makes it easier to sort.
Entry = namedtuple("Entry", "name views")

def read():
    data_files = []
    for file in glob.glob("*.txt"):
        with open(file, 'r') as infile:
            for line in infile.read().splitlines():
                # For each line in the file

                # Split apart our line
                line = line.split(' ')
                # Create an Entry object with our name and views
                # and add it to our data_files.
                data_files.append(Entry(line[1], int(line[2])))
    return data_files
result = read()

# We want to sort based on views so return the views.
def sort_meth(x):
    return x.views
    # If you want to sort by views then name you can do
    # return (x.views, x.name)

# Sort our result
result.sort(key=sort_meth, reverse=True)
for entry in result: # Print each entry
  print(entry.name, entry.views)

推荐阅读