2017-11-28 10 views
0

私はいくつかのマップはUbuntuで、commmandとのpython 2のコードを減らすテストしてい:Map Reduce:なぜこのコードは最大でも、最小ではないのに正しい出力を出すのですか?

cat testfile2 | ./mapper.py | sort | ./reducer.py 

私はmaxの正しい出力を得ることが、もminではない、それはしていないかのように、私は分の値1を取得し、これまでの時間を元の値から変更されました。 'value'の値はすべて1より小さいので、forループの最初の反復ではminを最初の値に変更し、それ以降の反復でminを更新する必要があります。私は自分の心を失っているのですか、コードに愚かな間違いがありますか?助けてください!

#!/usr/bin/python 

import sys 

def reducer(): 
    max = 0 
    min = 1 
    old_tuple = ('foo', 'bar') 
    i = 0 

    for line in sys.stdin: 
     data = line.strip().split("\t") 

     if len(data) != 3: 
      continue 

     city, year, value = data 
     new_tuple = (city, year) 

     if old_tuple != new_tuple: 
      if i != 0: 
       print "{0}\t{1}\t{2}\t{3}".format(old_tuple[0], old_tuple[1], max, min)    
       max = 0 
       min = 1 
     i += 1  
     old_tuple = new_tuple 
     if min > value: 
      min = value 

     if max < value: 
      max = value 


    if old_tuple != ('foo', 'bar'): 
     print "{0}\t{1}\t{2}\t{3}".format(old_tuple[0], old_tuple[1], max, min) 



if __name__ == '__main__': 
    reducer() 

出力Iは、まず私がキーワードである変数名として最小値と最大値を使用していたので、

Alert 2009 0.215236752 1 
Winnipeg 2017 0.032557214 1 
+1

Pythonは私の言語ではありませんが、文字列 'value'を浮動小数点に変換するのを忘れてしまったようです。そのような変換がなければ、比較は辞書的に実行され、数値的には実行されません。 – gudok

答えて

0

のようなルックスを取得します。変更後

min => minimum 
max => maximum 

出力はまだ間違っていました。実際は同じ問題です。それは私がそれを働かせるよりPythonの方法で最小と最大を得ることを試みた後でしかありませんでした。私はPythonを初めて使っているので、これはPythonの方法ではまだまだ最善の方法ではないかもしれませんが、以下のコードは少なくとも最小値と最大値を必要に応じて取得しています。

#!/usr/bin/python 

import sys 
import math 

def reducer(): 
    list_ = [] 
    old_tuple = ('foo', 'bar') 
    i = 0 

    for line in sys.stdin: 
     data = line.strip().split("\t") 

     if len(data) != 3: 
      continue 

     city, year, value = data 
     new_tuple = (city, year) 

     if old_tuple != new_tuple: 
      if i != 0: 
       print "{0}\t{1}\t{2}\t{3}".format(old_tuple[0], old_tuple[1], max(list_), min(list_))   
       list_ = []  

     i += 1 
     list_.append(value) 
     old_tuple = new_tuple 

    if old_tuple != ('foo', 'bar'): 
     print "{0}\t{1}\t{2}\t{3}".format(old_tuple[0], old_tuple[1], max(list_), min(list_)) 


if __name__ == '__main__': 
    reducer() 
関連する問題