使用用户定义的规则对项目进行排序

时间:2010-11-27 05:03:22

标签: python sorting

例如,如果我有一个用户名列表,让我们调用这个列表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

4 个答案:

答案 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')]