在下面的代码中(按行业顺序按降序打印工资),
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
问题究竟在哪里?
答案 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=",")