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

「弁護士」を同じ「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

そして、私が削除すると --> 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

まず第一に、コードは説明どおりに機能します...給与の降順で出力します。設計どおりに機能しますか?

ちなみに、並べ替えコードは非常に複雑に見えます。場所と給与のペアを 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

まず、すべてのインデックスをインデックス-1にリセットします。これは、が1ベースのインデックスシステムでない限り、現在rows[i].values()[2]は等しくできないためです。PlumbersDictReader

Tokyo第二に、あなたが望む出力の最初の行と3番目の行のユニークな点は何Tokyoですか?dictを作成するときに、キーと同じ値を使用すると、以前にそのキーに関連付けられていたものがすべて上書きされます。Location.Professionキーなど、ある種の一意の識別子が必要です。次の手順を実行するだけで、すべての情報を保持するキーを取得できます。

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