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'

我无法真正弄清楚这一点。我该怎么做?

我正在寻找的是在配置文件中我对每个水果都有一个等级,该行应该打印出它的等级中的水果。

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,并指定您希望按排名而不是名称本身进行排序。对于您的第一个示例,这就是我要做的。它按值(它们的等级)对字典的键(水果名称)进行排序。

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

您的第二个示例很难阅读。我建议您对如此复杂的代码进行注释。

看起来您正在尝试创建一个包含 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 回答