0

数字に基づいて果物をランク付けすると思われるこのスクリプトがあります。

#! /usr/bin/python
fruits = {'Apple':1,'Banana':2,'Pineapple':3}
alist = [(v, k) for k, v in fruits.items()]
alist.sort(reverse=False)
fruit_order = str(alist).translate(None, "[]()'123456789").replace(", , ",    "    ,     ",").replace(" ", "")[1:]
print fruit_order

果物は実際には .append(fruits) によるチェックで作成されたリストです

#! /usr/bin/python
import re
from configobj import ConfigObj
config = ConfigObj('sites.conf')
fruits = []

substance = "juice"
target_list = config['MainConfig']['fruits']
for target in target_list:
  if re.search( config[target]['Skiplist'], substance, re.M|re.I):
     target = target + "'" + ":" + config[target]['Rank'] + ","
     fruits.append(target)
  else:
   print "Dident pass"
fruits1 = "{'" + "'".join(fruits) + "}"
alist = [(v, k) for k, v in fruits1.list()]
alist.sort(reverse=False)
fruit_rank = str(alist).translate(None, "[]()'123456789").replace(", , ", ",").replace(" ", "")[1:]

例 2 の print fruit_rank は、例 1 の test とまったく同じように見える行を出力します。

しかし、私はまだexample2でエラーが発生しています.AttributeError: 'str' object has no attribute 'list'

そして、私はこれを本当に理解できません。どうすればいいですか?

iam が探しているのは、各果物のランクがある構成ファイルにあります。行はそのランクで果物を出力する必要があります。

4

2 に答える 2

2
fruits = {'Apple': 1,'Banana': 2,'Pineapple': 3}
print ','.join(sorted(fruits, key=fruits.get))
于 2012-12-14T08:42:48.010 に答える
0

組み込み関数 を使用sortedし、名前自体ではなくランクで並べ替えるように指定する必要があります。最初の例として、これが私がすることです。dict のキー (果物の名前) をその値 (ランク) で並べ替えます。

fruits = {'Apple':1,'Banana':2,'Pineapple':3}
sorted_keys = sorted(fruits.keys(), key=lambda k: fruits[k])

2番目の例は非常に読みにくいです。複雑なコードにはコメントを付けることをお勧めします。

Python コードを含む文字列を作成し、そのコードを実行しようとしているようです。みたいなeval発言。これは良いプログラミング方法ではありません。あなたは次のようなことをしたいと思うでしょう:

fruits = {} # create dict
for line in my_file.readlines():
    fruit_name, rank = function_to_parse_line(line)
    fruits[fruit_name] = rank
sorted_keys = sorted(fruits.keys(), key=lambda k: fruits[k])

これで、データを読み取るコードとデータを並べ替えるコードが適切に分離されました。別の種類のファイルからデータを読み取りたい場合は、 を再定義するだけfunction_to_parse_lineです。

于 2012-12-14T08:50:25.240 に答える