Python CSV模块排序输出意外
在下面的代码中(用于按降序打印工资,按专业排序) 当我在条件语句中加入“水管工”时,水管工工资的输出结果是:Python CSV模块排序输出意外,python,sorting,csv,Python,Sorting,Csv,在下面的代码中(用于按降序打印工资,按专业排序) 当我在条件语句中加入“水管工”时,水管工工资的输出结果是: Tokyo,400 Delhi,300 London,100 当我将“律师”置于相同的“如果”条件下时,输出为: Tokyo,800 London,700 Delhi,400 CSV的内容如下: City,Job,Salary Delhi,Lawyers,400 Delhi,Plumbers,300 London,Lawyers,700 London,Plumbers,100 T
Tokyo,400
Delhi,300
London,100
当我将“律师”置于相同的“如果”条件下时,输出为:
Tokyo,800
London,700
Delhi,400
CSV的内容如下:
City,Job,Salary
Delhi,Lawyers,400
Delhi,Plumbers,300
London,Lawyers,700
London,Plumbers,100
Tokyo,Lawyers,800
Tokyo,Plumbers,400
当我删除-->if行[i].values()[2]='Plumbers':首先,将所有索引重置为索引-1,与当前的
行[i]相同。除非DictReader
是基于1的索引系统,否则values()[2]
不能等于Plumbers
其次,您希望输出的第一行的Tokyo
和第三行的Tokyo
有什么独特之处?创建dict时,使用与键相同的值将导致覆盖以前与该键关联的内容。您需要某种唯一标识符,例如密钥的Location.Profession
。您只需执行以下操作即可获得一个将保留所有信息的密钥:
key = "".join([rows[i].values()[0], rows[i].values()[1]], sep=",")
首先,将所有索引重置为索引-1,当前为
行[i]。除非DictReader
是基于1的索引系统,否则values()[2]
不能等于水管工
其次,您希望输出的第一行的Tokyo
和第三行的Tokyo
有什么独特之处?创建dict时,使用与键相同的值将导致覆盖以前与该键关联的内容。您需要某种唯一标识符,例如密钥的Location.Profession
。您只需执行以下操作即可获得一个将保留所有信息的密钥:
key = "".join([rows[i].values()[0], rows[i].values()[1]], sep=",")
首先,您的代码的工作方式如下所述。。。按降薪顺序输出。那么,它是否按设计工作
顺便说一下,您的排序代码似乎过于复杂。您不需要将位置/薪资对拆分为两个列表并对其进行独立排序。例如:
# Plumbers
>>> a
{'Delhi': '300', 'London': '100', 'Tokyo': '400'}
>>> [item for item in reversed(sorted(a.iteritems(),key=operator.itemgetter(1)))]
[('Tokyo', '400'), ('Delhi', '300'), ('London', '100')]
# Lawyers
>>> a
{'Delhi': '400', 'London': '700', 'Tokyo': '800'}
>>> [item for item in reversed(sorted(a.iteritems(),key=operator.itemgetter(1)))]
[('Tokyo', '800'), ('London', '700'), ('Delhi', '400')]
为了回答您的最后一个问题,当您删除“if”语句时:您正在字典中存储位置与薪资,并且字典不能有重复的键。它将包含每个位置的最新更新,它基于您的输入csv,是管道工的工资 首先,您的代码的工作方式如下所述。。。按降薪顺序输出。那么,它是否按设计工作
顺便说一下,您的排序代码似乎过于复杂。您不需要将位置/薪资对拆分为两个列表并对其进行独立排序。例如:
# Plumbers
>>> a
{'Delhi': '300', 'London': '100', 'Tokyo': '400'}
>>> [item for item in reversed(sorted(a.iteritems(),key=operator.itemgetter(1)))]
[('Tokyo', '400'), ('Delhi', '300'), ('London', '100')]
# Lawyers
>>> a
{'Delhi': '400', 'London': '700', 'Tokyo': '800'}
>>> [item for item in reversed(sorted(a.iteritems(),key=operator.itemgetter(1)))]
[('Tokyo', '800'), ('London', '700'), ('Delhi', '400')]
为了回答您的最后一个问题,当您删除“if”语句时:您正在字典中存储位置与薪资,并且字典不能有重复的键。它将包含每个位置的最新更新,它基于您的输入csv,是管道工的工资 对不起,问题出在哪里?两个输出都按降序排列。@isedev ok。首先,谢谢你解决了这个问题。还有一个疑问:当在远程服务器上编译相同的代码时,我发现这个错误->全局名称“a”不是定义的,这听起来不太可能。。。你确定没有打字错误、剪切粘贴错误、相同的python版本等吗?我确信我没有打字错误。语法错误等。。可能是python版本。但是,我想知道在Python3中会有什么变化导致了这个错误?(我使用了2.7,可能服务器包含3.0。我不知道…)只是在Python 3.2上尝试过。上面的代码导致了很多问题,但与未定义的“a”无关:)对不起,问题出在哪里?两个输出都按降序排列。@isedev ok。首先,谢谢你解决了这个问题。还有一个疑问:当在远程服务器上编译相同的代码时,我发现这个错误->全局名称“a”不是定义的,这听起来不太可能。。。你确定没有打字错误、剪切粘贴错误、相同的python版本等吗?我确信我没有打字错误。语法错误等。。可能是python版本。但是,我想知道在Python3中会有什么变化导致了这个错误?(我使用了2.7,可能服务器包含3.0。我不知道…)只是在Python 3.2上尝试过。上面的代码导致了很多问题,但与未定义的“a”无关:)使用.values()[some\u integer]
是危险的,因为字典没有排序:例如,无法保证您将获得位于0的位置。其次,您可以使用元组而不是字符串键,例如(第['City',第['professional'])
。使用.values()[some_integer]
是危险的,因为字典没有顺序:例如,无法保证您将获得0处的位置。其次,您可以使用元组而不是字符串键,如(第['City',第['professional]行)
。
# Plumbers
>>> a
{'Delhi': '300', 'London': '100', 'Tokyo': '400'}
>>> [item for item in reversed(sorted(a.iteritems(),key=operator.itemgetter(1)))]
[('Tokyo', '400'), ('Delhi', '300'), ('London', '100')]
# Lawyers
>>> a
{'Delhi': '400', 'London': '700', 'Tokyo': '800'}
>>> [item for item in reversed(sorted(a.iteritems(),key=operator.itemgetter(1)))]
[('Tokyo', '800'), ('London', '700'), ('Delhi', '400')]