错误:无法在python中分配给文字 - 想出我的错误

时间:2018-02-05 22:49:18

标签: python python-2.7

这是我第一次在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

2 个答案:

答案 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的下一行中收到错误。