我有这个脚本,假设根据数字对水果进行排名。
#! /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(水果)检查组成的清单
#! /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:]
print fruit_rank在示例2中打印出一行看起来与示例1中的test完全相同。
但我仍然在example2上出现错误,AttributeError:'str'对象没有属性'list'
我无法真正理解这一点。我该怎么办?
我想要的是在配置文件中我对每个水果都有一个等级,该行应该打印出其等级中的水果。
答案 0 :(得分:2)
fruits = {'Apple': 1,'Banana': 2,'Pineapple': 3}
print ','.join(sorted(fruits, key=fruits.get))
答案 1 :(得分:0)
您应该使用内置函数sorted
,并指定您希望按行列而不是名称本身进行排序。对于你的第一个例子,这就是我要做的。它按照其值(他们的等级)对dict的键(水果名称)进行排序。
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
。