2013-07-29 119 views
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]) 
+0

@HunterMcMillen我添加的代碼 – Rocket

+2

你真的需要在這裏使用正則表達式的輸出? –

+0

@SukritKalra nope,很確定我的答案沒有。 –

回答

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 
+0

我相信OP期望刪除高於最小值的任何值,但如果沒有問題持有他們,很好的答案。 –

+0

@SlaterTyranus:是的,它確實取決於他在輸入文件中有多少數據。 :) –

+0

假設它適合OP的目的很好,因爲它被接受。 +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]) 

此外,糾正我,如果我是錯誤的,但是看起來你的價值觀總是在它們之間留有空間,所以你不需要去掉正則表達式分割錘,而少一些正則表達式總是好的。讓我知道這是否會破壞測試集中的某些內容。

+0

是的,文本文件每次都有空間,價值和文件,就像'ERWEFA.txt 233' – Rocket