CSV模块排序输出意外

时间:2013-02-19 17:15:57

标签: python sorting csv

在下面的代码中(按行业顺序按降序打印工资),

reader = csv.DictReader(open('salaries.csv','rb'))
rows = sorted(reader)
a={}
for i in xrange(len(rows)):
    if rows[i].values()[2]=='Plumbers':
        a[rows[i].values()[1]]=rows[i].values()[0]
t = [i for i in sorted(a, key=lambda key:a[key], reverse=True)]
p=a.values()
p.sort()
p.reverse()
for i in xrange(len(a)):
    print t[i]+","+p[i]

当我在条件陈述中加入'管道工'时,管道工的薪水输出为:

Tokyo,400 
Delhi,300 
London,100

当我将'律师'置于同一'if'条件下时,输出为:

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

当我删除 - >如果rows [i] .values()[2] =='Plumbers':< - 来自程序, 然后它应该打印所有输出,但它只打印这3:

Tokyo,400 
Delhi,300 
London,100

虽然输出应该类似于:

Tokyo,800
London,700
Delhi,400
Tokyo,400 
Delhi,300 
London,100

问题究竟在哪里?

2 个答案:

答案 0 :(得分:2)

首先,您的代码按照描述...以降序 salary 顺序输出。那么按设计工作?

顺便说一句,您的排序代码似乎过于复杂。您无需将位置/工资对拆分为两个列表并单独对其进行排序。例如:

# 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,是管道工的工资。

答案 1 :(得分:1)

首先,将所有索引重置为 index - 1 ,因为当前rows[i].values()[2]不能等于Plumbers,除非DictReader是基于1的索引系统。

其次,您想要的输出的第一行中的Tokyo和第三行的Tokyo有什么独特之处?创建dict时,使用与键相同的值将导致覆盖之前与该键关联的任何内容。您需要某种唯一标识符,例如密钥的Location.Profession。您只需执行以下操作即可获得一个可保留所有信息的密钥:

key = "".join([rows[i].values()[0], rows[i].values()[1]], sep=",")