0

在下面的代码中(用于按降序打印工资,按专业排序),

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

当我将“律师”置于相同的“如果”条件下时,输出为:

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 rows[i].values()[2]=='Plumbers': <-- 时,它应该打印所有输出,但它只打印这 3 个:

Tokyo,400 
Delhi,300 
London,100

虽然输出应该类似于:

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

问题究竟出在哪里?

4

2 回答 2

2

首先,您的代码按描述工作......按薪水降序输出。所以按设计工作?

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

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

于 2013-02-19T17:47:39.243 回答
1

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

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

key = "".join([rows[i].values()[0], rows[i].values()[1]], sep=",")
于 2013-02-19T17:31:09.790 回答