Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Tìm sub-list dài nhất trong nested list Python

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.