Python排名和列表

Python排名和列表,python,rank,Python,Rank,我有一个脚本,它假设根据一个数字对水果进行排序 #! /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(", , ", " , ",

我有一个脚本,它假设根据一个数字对水果进行排序

#! /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
水果实际上是由check with.append(水果)组成的列表

例2中的print fruit_rank打印出一行,看起来与例1中的测试完全相同

但我仍然在示例2中遇到一个错误,AttributeError:'str'对象没有属性'list'

我真的搞不懂这个。我该怎么做


我要查找的是在配置文件中,我为每个水果都有一个等级,该行应该打印出等级中的水果。

您应该使用内置函数
排序
,并指定您希望按等级排序,而不是按名称本身排序。对于你的第一个例子,这里是我要做的。它根据dict的值(它们的等级)对dict的键(水果名)进行排序

fruits = {'Apple': 1,'Banana': 2,'Pineapple': 3}
print ','.join(sorted(fruits, key=fruits.get))
你的第二个例子很难理解。我建议您对如此复杂的代码进行注释

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

水果1=“{'+””””。join(水果)+“}”
你似乎想用你之前创建的字符串创建一个字典,但最终得到的不是一个字典,而是一个字符串。代码最简单的一行修复方法是直接在下面添加
exports1=eval(exports1)
。@primo:Nooo,不要使用
eval()
。您不应该通过将字符串混合在一起并对其求值来构造字典。“这真是个坏主意!”我同意。for循环应该直接构造字典,而不是字符串。+1:Huh,我不知道将字典传递到
列表中只会得到键。比我拥有的要好得多。@Blender这是因为迭代
dict
会迭代键,所以
list
构造函数会看到一个iterable并通过迭代来构造一个列表。
fruits = {'Apple':1,'Banana':2,'Pineapple':3}
sorted_keys = sorted(fruits.keys(), key=lambda k: fruits[k])
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])