2012-12-14 58 views
0

我有这个脚本是基于一个数字来排列水果。Python排名和列表

#! /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 

水果是actully(水果)例如

#! /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:] 

打印fruit_rank与检查用.append构成一个列表2个打印出一条线,看起来就像在例如试验1

但是iam在example2上仍然出现错误,AttributeError:'str'对象没有属性'list'

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

iam正在寻找的是在配置文件中我有每个水果的排名,该行应打印出其排名中的水果。

+0

这一行:'fruits1 =“{“” +“””。加入(水果)+‘}’'你似乎打算创建您以前创建的字符串一本字典,但你到底是什么不是字典,而是字符串。你的代码最简单的一行修正就是直接在下面添加'fruits1 = eval(fruits1)'。 – primo

+0

@primo:不,不要使用'eval()'来做这件事。您不应该通过将字符串混合在一起并对它们进行评估来构建字典。这是一个非常糟糕的主意。 – Blender

+0

@Blender我同意。 for循环应该直接构造字典,而不是字符串。 – primo

回答

2
fruits = {'Apple': 1,'Banana': 2,'Pineapple': 3} 
print ','.join(sorted(fruits, key=fruits.get)) 
+0

+1:嗯,我不知道,传入一个字典成'list'只想拿到钥匙。比我拥有的要好得多。 – Blender

+0

@Blender这是因为遍历一个'dict'迭代的钥匙,所以'list'构造看到一个迭代和迭代来构造一个列表。 – katrielalex

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