如何使用字母和数字组合对嵌套的元组列表进行排序

How do I sort nested list of tuples with letter and number combinations

我需要先根据整数(第二个元素)对我的嵌套元组列表进行排序,然后对 string/number 组合(第一个元素)进行排序。我试图在第二个元素排序后让第一个元素按升序排列。一个很好的例子是第二个元素为 10 的元组。d522 应该是十组中的第一个元组。

预期输出示例

#[[('d51', 23), ('d874', 20), ('d486', 15), ('d329', 12), ('d1328', 11), ('d1268', 11), ('d114', 11), ('d522', 10),('d717', 10),('d792', 10)]
tupple=[[('d51', 23), ('d874', 20), ('d486', 15), ('d329', 12), ('d1328', 11), ('d1268', 11), ('d114', 11), ('d792', 10), ('d717', 10),('d522', 10)],
        [('d51', 23), ('d874', 20), ('d486', 15), ('d329', 12), ('d1328', 11), ('d1268', 11)]]

for item in tupple:
    sorted(item, key=lambda element: (element[1], (int("".join([i for i in element[0] if i.isdigit()])))),reverse=True)
# new = [[item[0] for item in inner] for inner in tupple]
tupple

###output  [[('d51', 23),  ('d874', 20),  ('d486', 15),  ('d329', 12),  ('d1328', 11), ('d1268', 11),  ('d114', 11),  ('d792', 10),  ('d717', 10),  ('d522', 10)], [('d51', 23),  ('d874', 20),  ('d486', 15),  ('d329', 12),  ('d1328', 11),  ('d1268', 11)]]

您可以强制密钥的第二部分为相反的方向。在这种情况下,这很容易:只需在创建的数字前面加上一个减号,然后(二次)比较就会反转。

(您还忘记将 sorted() 的结果分配回 tupple[i],因为 sorted() returns 一个副本;它不会改变 item 到位,与 item.sort() 形成对比。但我发现 tupple[i] = sorted(...) 在这里更清楚。

tupple=[[('d51', 23), ('d874', 20), ('d486', 15), ('d329', 12), ('d1328', 11), ('d1268', 11), ('d114', 11), ('d792', 10), ('d717', 10),('d522', 10)],
        [('d51', 23), ('d874', 20), ('d486', 15), ('d329', 12), ('d1328', 11), ('d1268', 11)]]

for i, item in enumerate(tupple):
    tupple[i] = sorted(item, key=lambda element: (element[1], -int("".join(i for i in element[0] if i.isdigit()))), reverse=True)
    # Or alternatively
    # item.sort(key=lambda element: (element[1], -int("".join(i for i in element[0] if i.isdigit()))), reverse=True)
tupple

这导致

[[('d51', 23), ('d874', 20), ('d486', 15), ('d329', 12), ('d114', 11), 
('d1268', 11), ('d1328', 11), ('d522', 10), ('d717', 10), ('d792', 10)], 
[('d51', 23), ('d874', 20), ('d486', 15), ('d329', 12), ('d1268', 11), ('d1328', 11)]]