这是我第一次在stackoverflow上提问。我是mapper和reducer概念的新手。我有一个任务。我有一个csv文件,其中包含2007-2016年不同国家的人工费率。我正在尝试编写一个代码,它给我的平均率最高的国家。我在python中写这个并且得到一个错误无法分配给literal.I我在第一个mapper步骤得到这个错误。请帮忙!以下是我的代码:
def steps(self):
return [
MRStep(mapper=self.mapper_get_Country_Name,
reducer=self.reducer_Average_rate),
MRStep(mapper=self.mapper_make_Average_key,
reducer=self.reducer_output_Country_Name)
]
def mapper_get_Country_Name(self, key, line):
(SeriesName, SeriesCode, CountryName, CountryCode,2007,2008,
2009,2010,2011,2012,2013,2014,
2015,2016)=line.split(',')
yield CountryName, float(Average_rate)
def reducer_Average_rate(self, CountryName, Average_rate):
yield CountryName, Average_rate
def mapper_make_Average_key(self, CountryName, Average_rate):
yield float(Average_rate), CountryName
def reducer_output_Country_Name(self,Average_rate, CountryName):
yield max(Average_rate), CountryName
答案 0 :(得分:2)
问题出在这一行:
(SeriesName, SeriesCode, CountryName, CountryCode,2007,2008,
2009,2010,2011,2012,2013,2014,
2015,2016)=line.split(',')
Python允许您将一部分行分配给一堆变量,前四个项目将作为变量名称。但是,此后的项目是数字。数字是一个字面值 - 也就是说,它不能用作其他任何名称 - 2016年仅表示20 16。
但是,如果您对这些值不感兴趣,可以通过几种方法忽略它们。
首先你可以使用“_”下划线语法,在python中意味着“忽略这个值”:
(SeriesName, SeriesCode, CountryName, CountryCode, _, _,
_, _, _, _, _, _,
_, _)=line.split(',')
现在这显然有点单调乏味。 相反,您可以删除前四个项目的列表并仅指定它们:
SeriesName, SeriesCode, CountryName, CountryCode = line.split(',')[:4]
“[:4]”语法仅表示前4项 - 该操作称为切片。 这也意味着可以删除另一组括号,因为它在一行上。
答案 1 :(得分:1)
对于下一个问题,请包含错误本身。它包含许多有用的信息。这样可以提出一个更好的问题,即不会进行投票,并且可以更快地获得高质量的答案。
您的问题似乎与:
(SeriesName, SeriesCode, CountryName, CountryCode,2007,2008,
2009,2010,2011,2012,2013,2014,
2015,2016)=line.split(',')
你基本上是想做:
2007 = line.split(',')[4]
2008 = line.split(',')[5]
# etc.
您无法为文字指定新值。 2007
是文字,而不是变量。这就是你得到的错误。你可能想要这样的东西:
(SeriesName, SeriesCode, CountryName, CountryCode,v_2007,v_2008,
v_2009,v_2010,v_2011,v_2012,v_2013,v_2014,
v_2015,v_2016)=line.split(',')
然后,您可能需要计算实际平均值,否则您将在未定义Average_rate
的下一行中收到错误。