例如,如果我有一个用户名列表,让我们调用这个列表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
答案 0 :(得分:3)
您始终可以将用户名存储在列表中,然后使用内置sorted()
函数创建用户名的排序列表。例如:
users = ['Guido', 'Alex', 'Jack', 'Brian']
users_sorted = sorted(users)
print repr(users_sorted)
这样的结果将是按字母顺序排序的用户列表:
['Alex', 'Brian', 'Guido', 'Jack']
sorted
需要多个参数,因此如果要定义一种比较列表中项目的特殊方法,可以执行sorted(user, cmp=function)
,其中function是您的特殊比较函数。
有关详情,请参阅docs on sorted()。
答案 1 :(得分:2)
sorted_username_list = sorted(usernames, key=user_sorter)
其中:
usernames
是一个列表
user_sorter
是一个获取用户名并返回用户实际名称的函数
对于相同的实际名称,您可以编写分拣机功能:
def user_sorter(x):
return actual_name_of_user(x) + x
答案 2 :(得分:2)
您可能想要使用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;,=和&lt;通过覆盖用户配置文件数据类的__gt__(), __eq__() and __lt__()
。有关详细信息,请参阅Python 2.7 reference - Data model。
答案 3 :(得分:0)
将args打包到元组中并使用内置排序对它们进行排序。 然后解压。
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')]