2010-11-27 21 views
2

例如,如果我有一個用戶名列表,我們可以調用此列表L1,每個用戶名都有他/她自己的配置文件(不存儲在L1中)。我們應該如何編寫函數,以便根據實際名稱對用戶名進行排序,如果有任何用戶名與實際名稱綁定在一起,則按用戶名進行排序。請注意,我可以通過編寫username[1]來獲取用戶的用戶名,用戶名是唯一的。使用用戶定義的規則排序項目

這是我寫的:

def username(s1, s2): 

    if s1 < s2: 
     return -1 
    elif s1 > s2: 
     return 1 
    else: 
     # How can i sort them by username if they have the same actual name 
     return 0 

回答

2

您可以將用戶名總是存儲在一個列表中,然後使用內置sorted()功能,使用戶名的排序列表。例如:

users = ['Guido', 'Alex', 'Jack', 'Brian'] 
users_sorted = sorted(users) 
print repr(users_sorted) 

這樣做的結果是用戶的名單按字母順序排序:

['Alex', 'Brian', 'Guido', 'Jack'] 

sorted需要幾個參數,所以如果你要定義一個特殊的方式在列表中比較項目,你可以做sorted(user, cmp=function),其中函數是你的特殊比較函數。

查看docs on sorted()瞭解更多。

2
sorted_username_list = sorted(usernames, key=user_sorter) 

其中:

usernames是一個列表

user_sorter是採用用戶名,並返回用戶的真實姓名

爲同一實際名稱的功能,你可以寫分揀機功能這個:

def user_sorter(x): 
    return actual_name_of_user(x) + x 
2

你可能想要我們e sorted(iterable, key=function)。例如:

users = list(something) # a list of all the usernames 
user_profiles = dict(something) # a dict of the profiles 

users_sorted = sorted(users, key=lambda un: user_profiles[un]) 

您還可以通過您的用戶配置文件數據類的覆蓋__gt__(), __eq__() and __lt__()過載比較操作符,如>,=和<。有關更多信息,請參閱Python 2.7 reference - Data model

0

將參數打包到元組中,並使用內置排序對它們進行排序。 然後解壓縮。

usernames = ['bbob', 'srv', 'gman', 'salmer'] 
firstnames = ['Billy', 'Steve', 'Guy', 'Steve'] 
tuples = zip(firstnames, usernames) 
tuples.sort() 
users_sorted, first_sorted = zip(*tuples) 


>>>tuples 
[('Billy', 'bbob'), ('Guy', 'gman'), ('Steve', 'salmer'), ('Steve', 'srv')]