2012-12-14 56 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