0

我有一个包含数据的文本文件

EASSDS.txt 2738
EQQSDS7M.txt 394
EOG66.txt 354
EASSDS.txt 292
EQQSDS7M.txt 301

我希望它应该只选择最小值并删除最大值 Output.txt

EOG66.txt 354
EASSDS.txt 292
EQQSDS7M.txt 301

如果找到重复项,则仅选择具有最小值的问题,例如我在输出和输入中显示的

下面是我试过的代码

with open('input.txt') as nums:
    lines = re.findall(r'\w+\.txt\s+\d+', nums.read())

numbers = {}
for line in lines:
    line_split = re.split(r'\.txt\s+', line)
    count = line_split[1]
    numbers[line_split[0]] = int(line_split[1])
4

2 回答 2

3

我会在这里使用一个简单的方法defaultdict

>>> from collections import defaultdict
>>> m = defaultdict(list)
>>> with open('testFile.txt' ,'r') as f:
        for line in f:
            name, val = line.split()
            m[name].append(val)
>>> m
defaultdict(<type 'list'>, {'EOG66.txt': ['354'], 'EASSDS.txt': ['2738', '292'], 'EQQSDS7M.txt': ['394', '301']})
>>> with open('output.txt', 'w') as f:
        for elem in m:
            f.write("{} {}\n".format(elem, min(map(int, m[elem]))))

这给了我一个像

EOG66.txt 354
EASSDS.txt 292
EQQSDS7M.txt 301
于 2013-07-29T18:09:05.237 回答
2

您快到了,但请记住,您需要一些分支逻辑,以防您已经为数字编制索引,如下所示:

number = {}
for line in lines:
    split_line = line.split()
    if numbers.get(split_line[0], False):
        numbers[split_line[0]] = min(numbers[split_line[0]], int(split_line[1]))
    else:
        numbers[split_line[0]] = int(split_line[1])

此外,如果我错了,请纠正我,但您的值之间似乎总是有一个空格,所以您并不完全需要打破正则表达式拆分锤,并且较少的正则表达式总是好的。让我知道这是否会破坏您的测试集中的某些内容。

于 2013-07-29T18:04:09.307 回答