Mô tả
Cho nested list: [[1,2], [2,45,6,7], [11,65,2]]. Tìm sub-list có độ dài lớn nhất và độ dài đó.
Kết quả: ([2, 45, 6, 7], 4)
Giải pháp 1: max() + key=lambda (Pythonic, khuyên dùng)
def longest(lst):
longest_list = max(lst, key=len)
max_length = len(longest_list)
return longest_list, max_length
listA = [[1,2], [2,45,6,7], [11,65,2]]
print("Longest:", longest(listA)) # ([2, 45, 6, 7], 4)
Giải pháp 2: max() + map(len, ...) (cách gốc)
def longest(lst):
longestList = max(lst, key=lambda i: len(i))
maxLength = max(map(len, lst))
return longestList, maxLength
Giải pháp 3: Vòng lặp thủ công (giáo dục)
def longest(lst):
longestList = []
maxLength = max(len(x) for x in lst)
for sublist in lst:
if len(sublist) == maxLength:
longestList = sublist
break # lấy cái đầu tiên
return longestList, maxLength
Xử lý trường hợp nhiều sub-list cùng độ dài max
def all_longest(lst):
"""Trả về TẤT CẢ sub-list có độ dài max."""
max_len = max(len(x) for x in lst)
return [x for x in lst if len(x) == max_len]
listA = [[1,2], [3,4,5], [6,7], [8,9,10]]
print(all_longest(listA)) # [[3, 4, 5], [8, 9, 10]]
So sánh hiệu năng
import timeit
setup = "lst = [[1]*i for i in range(1000)]"
t1 = timeit.timeit("max(lst, key=len)", setup, number=10000)
t2 = timeit.timeit("max(lst, key=lambda x: len(x))", setup, number=10000)
t3 = timeit.timeit("""
max_len = max(len(x) for x in lst)
next(x for x in lst if len(x) == max_len)
""", setup, number=10000)
print(f"max(key=len): {t1:.4f}s")
print(f"max(key=lambda): {t2:.4f}s")
print(f"loop + max: {t3:.4f}s")
Kết quả thường: max(key=len) nhanh nhất do C-optimized.