1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
| # Basic sorting with reverse parameter
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
ascending = sorted(numbers)
descending = sorted(numbers, reverse=True)
print(f"Ascending: {ascending}") # [1, 1, 2, 3, 4, 5, 5, 6, 9]
print(f"Descending: {descending}") # [9, 6, 5, 5, 4, 3, 2, 1, 1]
# Sorting complex objects
students = [
{'name': 'Alice', 'grade': 85, 'age': 20},
{'name': 'Bob', 'grade': 92, 'age': 19},
{'name': 'Charlie', 'grade': 78, 'age': 21},
{'name': 'Diana', 'grade': 96, 'age': 20}
]
# Sort by grade (highest first)
by_grade_desc = sorted(students, key=lambda s: s['grade'], reverse=True)
print("\nStudents by grade (highest first):")
for student in by_grade_desc:
print(f" {student['name']}: {student['grade']}")
# Multiple sort criteria with reverse
def multi_level_sort():
"""Demonstrate complex sorting with multiple criteria"""
data = [
('Alice', 'Engineering', 85, 20),
('Bob', 'Arts', 92, 19),
('Charlie', 'Engineering', 78, 21),
('Diana', 'Arts', 96, 20),
('Eve', 'Engineering', 85, 19),
('Frank', 'Arts', 78, 22)
]
# Sort by department (ascending), then grade (descending), then age (ascending)
from operator import itemgetter
# Method 1: Using multiple sorted() calls (applied in reverse order)
result1 = sorted(data, key=itemgetter(3)) # Sort by age first
result1 = sorted(result1, key=itemgetter(2), reverse=True) # Then by grade (desc)
result1 = sorted(result1, key=itemgetter(1)) # Finally by department
# Method 2: Using tuple key with negation for reverse
result2 = sorted(data, key=lambda x: (x[1], -x[2], x[3]))
# Method 3: Custom comparison with multiple criteria
def sort_key(item):
name, dept, grade, age = item
return (dept, -grade, age) # Negative grade for descending
result3 = sorted(data, key=sort_key)
print("Multi-level sort results:")
print("(Name, Department, Grade, Age)")
for item in result3:
print(f" {item}")
# Verify all methods produce same result
assert result1 == result2 == result3
# Advanced sorting patterns
def advanced_sorting_patterns():
"""Show advanced use cases for sorted() with reverse"""
# Sort dictionary by values (descending)
word_counts = {'apple': 23, 'banana': 45, 'cherry': 12, 'date': 67}
# Get items sorted by count (highest first)
sorted_items = sorted(word_counts.items(), key=lambda x: x[1], reverse=True)
print("\nWords by frequency:")
for word, count in sorted_items:
print(f" {word}: {count}")
# Sort by string length (longest first), then alphabetically
words = ['cat', 'elephant', 'dog', 'hippopotamus', 'ant', 'zebra']
sorted_words = sorted(words, key=lambda w: (-len(w), w))
print(f"\nWords by length (desc), then alphabetically: {sorted_words}")
# Custom reverse logic for complex objects
class Task:
def __init__(self, name, priority, due_date):
self.name = name
self.priority = priority # 1 = high, 2 = medium, 3 = low
self.due_date = due_date
def __repr__(self):
return f"Task({self.name}, P{self.priority}, {self.due_date})"
from datetime import date
tasks = [
Task("Fix bug", 1, date(2020, 8, 1)),
Task("Write docs", 2, date(2020, 7, 30)),
Task("Code review", 1, date(2020, 7, 29)),
Task("Meeting", 3, date(2020, 7, 31)),
]
# Sort by priority (high first), then due date (earliest first)
sorted_tasks = sorted(tasks, key=lambda t: (t.priority, t.due_date))
print("\nTasks by priority and due date:")
for task in sorted_tasks:
print(f" {task}")
# Run examples
multi_level_sort()
advanced_sorting_patterns()
# Performance comparison: sorted() vs list.sort()
def sorting_performance_comparison():
"""Compare sorted() vs list.sort() performance"""
import random
import time
# Generate test data
data = [random.randint(1, 1000) for _ in range(100000)]
# Test sorted() - creates new list
data_copy1 = data.copy()
start = time.time()
result = sorted(data_copy1, reverse=True)
sorted_time = time.time() - start
# Test list.sort() - modifies in place
data_copy2 = data.copy()
start = time.time()
data_copy2.sort(reverse=True)
sort_time = time.time() - start
print(f"\nPerformance comparison (100K integers):")
print(f"sorted(): {sorted_time:.4f}s")
print(f"list.sort(): {sort_time:.4f}s")
print(f"sort() is {sorted_time/sort_time:.2f}x faster (in-place)")
# Verify results are identical
assert result == data_copy2
sorting_performance_comparison()
|