如何排序嵌套列表而不使用可选参数`key`

2024-04-29 04:10:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有点被家庭作业问题困住了。 假设我有一个这样的列表:

[('Paul George', 1), ('Luke Skywalker', 2), ('Mitchell Piker', 3), ('Phil Dam', 1)]

我必须编写一个函数,使列表按第二个元素(即整数值)排序。另外,如果两个人有相同的整数,那么我必须按字母顺序排序。另外,我可以使用sort,但不能使用可选参数key。所以我应该有这样的东西:

[('Mitchell Piker', 3), ('Luke Skywalker', 2), ('Paul George', 1), ('Phil Dam', 1)]

>>> def sort(lst: List[Tuple[str, int]]):
    """Return the list of tuples from largest integer score to lowest 
    integer score. If two people have the same score, then sort them by 
    alphabetical order.
    """
    lst2 = []
    lst2.append(lst[0])
    for i in range(len(lst)):
        for j in range(len(lst2)):
            if lst[i][-1] > lst2[j][-1] and lst[i][-1] not in lst2:
                lst2.insert(0, lst2[i])
            if lst[i][-1] < lst2[j][-1] and lst[i][-1] not in lst2:
                lst2.append(lst2[i][-1])
    return lst2

但是我得到一个错误。有人能帮忙吗?非常感谢


Tags: in列表整数sortscorelukelstskywalker
3条回答

假设函数的签名只是在问题中被弄乱了(否则代码将引发NameError

问题在于这一行:

for j in range(len(lst2))

lst2的长度为零-循环永远不会执行。。。你知道吗

那怎么办?你知道吗

lst = [('Paul George', 1), ('Luke Skywalker', 2), ('Mitchell Piker', 3), ('Phil Dam', 1)]

[(n,-i) for (i,n) in sorted([(-i,n) for (n,i) in lst])]


[('Mitchell Piker', 3),
 ('Luke Skywalker', 2),
 ('Paul George', 1),
 ('Phil Dam', 1)]

解释:sorted做你想做的,除了:

  • 它将首先根据第一个元素(名称)排序

  • 然后根据第二个元素(数字)排序,但也按升序排序

所以要解决这个问题:将它与元素交换以及否定数字结合起来。你知道吗

如果可以假设数字总是整数,那么可以使用它们来索引值,就像这样(也可以通过sort而不是sorted来实现)

groups = defaultdict(list)
max_id = -1
for name, idx in lst:
    groups[idx].append(name)
    if max_id < idx:
        max_id = idx
result = [(name, idx) for idx in range(max_id, -1, -1) for name in sorted(groups.get(idx, []))]
# [('Mitchell Piker', 3), ('Luke Skywalker', 2), ('Paul George', 1), ('Phil Dam', 1)]

编辑:

from collections import defaultdict
groups = defaultdict(list)
for name, idx in lst:
    groups[idx].append(name)
[(name, idx) for idx in sorted(groups.keys())[::-1] for name in sorted(groups[idx])]

注意:如果你反对使用groups.keys(),你可以用[x for x in groups]来代替。。。你知道吗

相关问题 更多 >