【问题标题】:CSV module sorted output unexpectedCSV 模块排序输出意外
【发布时间】:2013-02-04 11:42:41
【问题描述】:

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

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':

Tokyo,400 
Delhi,300 
London,100

虽然输出应该类似于:

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

问题到底出在哪里?

【问题讨论】:

  • 抱歉,问题出在哪里?两个输出按薪金降序排列。
  • @isedev 好的。首先,感谢您解决问题。只是另一个疑问:在远程服务器上编译相同的代码时,我收到此错误-> 全局名称“a”未定义
  • 这听起来不太可能......你确定你没有拼写错误、剪切粘贴错误、相同的 python 版本等......?
  • 我确定我没有错别字。语法错误等..可能是python版本。但后来我想知道产生这个错误的python 3会发生什么变化? (我使用的是 2.7,也许服务器包含 3.0。我不知道..)
  • 刚刚在 Python 3.2 上尝试过。上面的代码导致了很多问题,但与未定义“a”无关:)

标签: python sorting csv


【解决方案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=",")

【讨论】:

  • 使用.values()[some_integer] 是危险的,因为字典没有排序:例如,不能保证您会在 0 处获得位置。其次,您可以使用元组来代替创建字符串键,例如(row['City'], row['Profession'])
【解决方案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,是管道工的薪水。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多