Itertools.zip_longest python 3

Python One-Liner is field phái viết Python trên một dòng. Theo đó, mỗi một hành động được xác định được viết bởi các lệnh cô đọng gom lại trên một dòng duy nhất. Hành động xác định không phải là những hành động quá phức tạp, nhưng cũng không quá đơn giản. Ví dụ việc trao đổi giá trị giữa hai biến có thể coi là một hành động xác định như vậy. Python cho phép thực hiện điều này trên một dòng với lệnh duy nhất và với tôi đó là một trong các lệnh Python đẹp nhất

Python One-Liners cũng chính là tập hợp các mẹo [thủ thuật] Python Giải quyết các bài toán nhỏ một cách rút gọn theo phương pháp "làm nhiều ít. " Điều này thường khó thực hiện ở các ngôn ngữ khác. Nhưng chúng có thể thực hiện được trong Python do đặc trưng ngôn ngữ hỗ trợ cách viết như vậy. Không giới hạn cách sử dụng hàm lambda, Danh sách hiểu, bản đồ, bộ lọc, zip, dict, bộ. đã xây dựng các biểu tượng ngôn ngữ đặc biệt cho phép viết các mã rút gọn hơn các ngôn ngữ khác

Trong bài viết này, tôi sẽ tổng hợp một số bài toán đơn giản mà triển khai Python có thể được viết trên một dòng. Chúng là các bài toán cơ bản có liên quan đến danh sách. Tôi hi vọng những bạn chưa biết về các công thức trong bài này sẽ tìm thấy nhiều điểm lý thú, và qua đó càng hiểu được sức mạnh và sự hấp dẫn tuyệt vời của Python. Các công thức này một số được tôi thường xuyên sử dụng, một số được sưu tầm và các bạn có thể tìm thấy ở đâu đó trên internet

1. Làm phẳng một danh sách

Cho một danh sách dạng hai chiều như sau. L = [[1,2,3], [4,5,6], [7], [8,9]] hãy biến nó thành một định dạng [1, 2, 3, 4, 5, 6, . This is an number of giải thích một dòng của bài toán này

>>> L = [[1,2,3],[4,5,6], [7], [8,9]]
>>> sum[L, []]
>>> reduce[lambda x, y: x + y, L]
>>> list[itertools.chain[L]]  #import itertools.
>>> [item for sublist in L for item in sublist]

Python cung cấp cho bạn một tập hợp phong phú các cú pháp và hàm dựng sẵn cho phép bạn giải cùng một bài toán theo nhiều cách khác nhau. Trong các lời giải trên lời giải cuối cùng là nhanh nhất và nó cũng dễ hiểu nhất. Chi tiết các lời giải trên các bạn có thể xem trên trang. Tạo một danh sách phẳng ra khỏi danh sách các danh sách trong python. Hàm reduce đã bị loại bỏ kể từ Python 3000 [Được đề xuất bởi Guido van Rossum], tuy nhiên vẫn được đặt lại giữa các functools của thư viện, vậy bạn có thể sử dụng được không

>>> functools.reduce[lambda x, y: x + y, L]

Nếu danh sách L không phải là hai chiều, mà có thể chứa các danh sách con đệ quy, bạn có thể sử dụng hàm sau

def flatten[seq, a = list[]]:
    try:
        for item in seq:
            flatten[item, a]
    except TypeError:
        a.append[seq]
    return a

print flatten[[[1,2, [3,4], 5], 6, [7, [8, 9]]]]

2. Loại bỏ các phần tử trùng nhau trong danh sách

Hãy tạo ra một danh sách mới chứa các phần tử không trùng nhau của L. Một số cách giải trên một dòng

>>> L = dict.fromkeys[L].keys[]  # Python 3.x trả về iterator
>>> L = list[set[L]]
>>> [x for i, x in enumerate[L] if i==L.index[x]]

With L = [5,6,1,1,1,2,2,2,3,3,3] hai lời giải trên cho kết quả [1, 2, 3, 5, 6]. Cuối cùng lời giải thích cho kết quả [5, 6, 1, 2, 3]. Vì vậy, trong một số vấn đề, lời giải cuối cùng tốt hơn, do nó vẫn giữ nguyên thứ tự của các phần tử như ban đầu. Tuy nhiên lời giải cuối cùng chạy rất chậm. Hãy xem kết quả đo thời gian chạy của các lời giải thích như sau

>>> from timeit import Timer
>>> Timer["list[set[L]]", "L = range[10**4]"].timeit[10]
0.030437396173560671
>>> Timer["dict.fromkeys[L].keys[]", "L = range[10**4]"].timeit[10]
0.027800167602894277
>>> Timer["[x for i, x in enumerate[L] if i==L.index[x]]", "L = range[10**4]"].timeit[10]
25.005568798618903

Việc so sánh thời gian chạy giữa các Python One-Liner rất hay được các tác giả thực hiện. Chúng đánh giá khả năng sử dụng thực tế của mỗi công thức. Lời giải thích cuối cùng như các bạn thấy bài hát có ưu điểm không thể sử dụng được khi có bài kiểm tra xấu trên 10000 phần tử

3. Đếm số phần tử có trong một danh sách

Nếu chỉ đếm một phần tử thì quá đơn giản, sử dụng danh sách. đếm là xong, nhưng nếu để đếm tần số cho nhiều mục một lúc thì làm thế nào. Các giới hạn có L = [5,6,1,1,1,2,2,2,3,3] muốn tạo ra D={5. 1, 6. 1, 1. 3, 2. 3, 3. 2}

>>> dict[[[x, L.count[x]] for x in set[L]]]
>>> {x: L.count[x] for x in set[L]} # dict comprehensions, có từ Python 3.x
>>> collections.Counter[L] # import collections, có từ Python 3.x

Lời giải thích tuy dài nhưng có thể chạy trên hầu hết các bản Python > 2. 4. Hai lời giải thích chẳng qua là từ 1 ra nhưng với cú pháp mới của Python 3. x nó dễ hiểu và đơn giản hơn. Lời giải thích cuối cùng đơn giản đến mức bạn chỉ cần nhập bộ sưu tập. Bộ sưu tập mô-đun chứa các phương tiện cho phép bạn viết mã Python rút ngắn và chạy rất nhanh. Một ví dụ khác về cách sử dụng Bộ đếm trong bộ sưu tập mô-đun, đoạn mã này cho phép đếm tần số xuất hiện của các ký tự trong một chuỗi

>>> collections.Counter["abcabca"]
Counter[{'a': 3, 'c': 2, 'b': 2}]

Càng về sau phiên bản Python này càng hỗ trợ nhiều hơn các cú pháp và thư viện cho phép bạn viết các mã rút gọn hơn. This is special features of Python. Viết ít hơn làm nhiều hơn. Việc gia tăng hiểu biết của bạn về các thư viện là một kinh nghiệm quan trọng

4. Chia một danh sách thành nhiều danh sách

Bài toán chia một danh sách thành nhiều danh sách có thể gặp hai yêu cầu

  1. Chia danh sách thành nhiều danh sách có độ dài bằng nhau
  2. Chia danh sách thành n danh sách con có độ dài tương đương nhau [với kích thước khác biệt nhỏ nhất]

Một số vấn đề có thể được giải quyết bằng các chức năng sau

>>> SplitInto=lambda a,n: [a[i*n:[i+1]*n] \
.. for i in range[len[a] % n and len[a]/n + 1 or len[a]/n]]
>>> SplitInto[range[10], 3]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]

________số 8

>>> SplitInto = lambda L, n: zip_longest[*[iter[L]]*n]
>>> list[SplitInto[range[10], 3]]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, None, None]]
>>> SplitInto = lambda L, n: zip_longest[*[iter[L]]*n, fillvalue=-1]
>>> list[SplitInto[range[10], 3]]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, -1, -1]]

>>> functools.reduce[lambda x, y: x + y, L]
0

Wordpress 1, 4 used for Python version from 2. 3 trở đi. Hai lời giải thích 2, 3 sau đó yêu cầu phải có lệnh từ itertools import * và chỉ chạy từ Python 3. x trở đi. Chi tiết về lời giải này các bạn có thể xem thêm. Làm cách nào để chia danh sách thành các phần có kích thước bằng nhau trong Python?

Vấn đề số 2 có thể có lời giải sau

>>> functools.reduce[lambda x, y: x + y, L]
1

Lời giải thích trên đơn giản đến mức. không cần tìm thêm lời giải khác làm gì cho mệt. Tuy nhiên nó không chia theo đúng thứ tự. This is other way part of the part of

>>> functools.reduce[lambda x, y: x + y, L]
2

Cách viết này khá dài, nhưng vẫn giữ nguyên thứ tự giữa các phần tử. Các dòng chính dài là đặc trưng của Python One-liner

5. Check a list is file con of other list

Cho hai danh sách a, b. kiểm tra xem a có chứa b hay không. Danh sách a bao gồm danh sách b nếu tất cả các phần tử của b đều có trong a. Cách giải sau đã có một lần tôi trình bày, sử dụng toán tử thư viện và hàm rút gọn tích hợp sẵn, có thể sử dụng với mọi phiên bản Python 2. x

>>> functools.reduce[lambda x, y: x + y, L]
3

Từ Python 2. 4 bạn có thể sử dụng bộ

>>> functools.reduce[lambda x, y: x + y, L]
4

Từ Python 2. 5 bạn có thể viết

>>> functools.reduce[lambda x, y: x + y, L]
5

Toán tử mô-đun cung cấp cách sử dụng các thuật toán như các hàm. Trong ví dụ 1 thực tế chúng ta sử dụng toán tử trong thông thường. Các toán tử được sử dụng như các hàm cho phép kết hợp với các hàm tích hợp sẵn khác để viết các lệnh Python rất ngắn gọn và thuận tiện. Một ví dụ [được lấy trong tài liệu Python] tính tích vô hướng hai vector

>>> functools.reduce[lambda x, y: x + y, L]
6

Thật khó để viết ngắn hơn và chạy nhanh hơn như vậy. Các ví dụ trên càng nói rõ hơn điều tôi đã nhấn mạnh ở mục 3. các phiên bản Python càng về sau càng hỗ trợ tốt hơn việc viết các mã rút gọn và hiệu quả. Tuy nhiên, bạn phải cân nhắc lựa chọn giải pháp đúng cho phiên bản Python mà nó sẽ chạy

6. Sắp xếp nhiều cột

Cho các cột a, b, c. has the same size. Hãy sắp xếp chúng theo thứ tự a, b, c. Nội dung các dòng không thay đổi. Dưới đây là một ví dụ khai triển với 2 cột a, b

>>> functools.reduce[lambda x, y: x + y, L]
7

thật tuyệt vời. Chúng đơn giản đến mức khó có thể rút gọn hơn nữa. Công thức hoàn toàn ẩn trên một dòng có ít hơn 80 ký tự. Tất cả chỉ có 4 lệnh. Ít nhất nó cũng gây cho tôi nhiều phấn khích và ngạc nhiên. Và các bạn sẽ thấy trên nhiều diễn đàn Python, công việc tìm kiếm "One-Liner" thực sự là thú vị và là trò chơi hấp dẫn của các chuyên gia Python

7. Tổng kết

Khi kích thước dữ liệu bắt đầu vào một số lớn trong các hàm trả về danh sách trên đây cần được thay thế bằng các trạng thái hàm. Không hạn chế việc chia một danh sách thành nhiều danh sách bằng nhau nên viết thành hàm trạng thái, sẽ sử dụng ít bộ nhớ và nhanh hơn

>>> functools.reduce[lambda x, y: x + y, L]
8

Chuẩn viết mã Python không quá 80 ký tự trên một dòng. Python One-Liner viết hết các lệnh Python trên một dòng, làm cho các dòng dài hơn bình thường. Mã Python khó đọc và khó hiểu hơn do cách viết cô đọng, các biến được đặt tên rút gọn. Với các bài toán không mang tính cơ bản, các bạn nên hạn chế viết theo cách này

Các chương trình viết trên một dòng không có nghĩa là nhanh nhất. Thậm chí trong nhiều trường hợp để viết trên một dòng người ta phải chọn cách viết mất nhiều thời gian chạy hơn. Làm như vậy khi kích thước dữ liệu lớn hơn, tốt hơn hết hãy chọn cách viết tối ưu và chấp nhận mã dài hơn

Tôi hi vọng rằng các bạn sẽ thích thú với các ví dụ trên đây. Chắc chắn còn nhiều cách giải khác cho mỗi vấn đề mà tôi đã nêu ra. Nếu các bạn thấy vui lòng comment để mọi người cùng biết. Điều sau cùng tôi muốn nhấn mạnh là tuy việc tìm kiếm các lời giải một dòng cho mỗi vấn đề chỉ đơn giản là thú vui, ít mang tính ứng dụng, nhưng chúng thực sự sẽ kết thúc việc học hỏi và tìm kiếm kinh nghiệm của

Chủ Đề