选择最小值并删除最大值

时间:2013-07-29 17:54:51

标签: python python-2.7

我有一个包含

等数据的文本文件
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])

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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])

另外,如果我错了,请纠正我,但似乎你的价值观总是在他们之间有空间,所以你不需要破坏正则表达式分裂锤,而且正则表达式总是很好。如果这会破坏您的测试集中的某些内容,请告诉我。