Hướng dẫn return two lists from list comprehension python - trả về hai danh sách từ python hiểu danh sách

Tạo hai danh sách toàn diện là tốt hơn [ít nhất là cho danh sách dài]. Xin lưu ý rằng, câu trả lời được bỏ phiếu tốt nhất là chậm hơn có thể chậm hơn so với truyền thống cho các vòng lặp. Danh sách toàn diện là nhanh hơn và rõ ràng hơn.best voted answer is slower can be even slower than traditional for loops. List comprehensions are faster and clearer.

python -m timeit -n 100 -s 'rr=[];tt = [];' 'for i in range[500000]: rr.append[i*10];tt.append[i*12]' 
10 loops, best of 3: 123 msec per loop

> python -m timeit -n 100 'rr,tt = zip[*[[i*10, i*12] for i in range[500000]]]' 
10 loops, best of 3: 170 msec per loop

> python -m timeit -n 100 'rr = [i*10 for i in range[500000]]; tt = [i*10 for i in range[500000]]' 
10 loops, best of 3: 68.5 msec per loop

Sẽ thật tuyệt khi thấy danh sách toàn diện hỗ trợ tạo ra nhiều danh sách tại một thời điểm.

However,

Nếu bạn có thể tận dụng một vòng lặp truyền thống [chính xác là tính toán trung gian], thì có thể bạn sẽ tốt hơn với một vòng lặp [hoặc ____ 33/________ 34 bằng cách sử dụng

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
5]. Đây là một ví dụ: then it is possible that you will be better of with a loop [or an
num_list = [4, 11, 2, 19, 7, 6, 25, 12]
3/
num_list = [4, 11, 2, 19, 7, 6, 25, 12]
4 using
num_list = [4, 11, 2, 19, 7, 6, 25, 12]
5]. Here is an example:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in [range[1000] for x in range[10000]]: tmp = list[i]; rr.append[min[tmp]];tt.append[max[tmp]]" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min[list[i]] for i in [range[1000] for x in range[10000]]];tt=[max[list[i]] for i in [range[1000] for x in range[10000]]]"
100 loops, best of 3: 413 msec per loop

Tất nhiên, việc so sánh trong những trường hợp này là không công bằng; Trong ví dụ, mã và tính toán không tương đương vì trong vòng lặp truyền thống, kết quả tạm thời được lưu trữ [xem biến

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
6]. Vì vậy, sự hiểu biết danh sách đang thực hiện nhiều hoạt động nội bộ hơn [nó tính toán biến TMP hai lần !, Tuy nhiên, nó chỉ chậm hơn 25%].the comparison in these cases are unfair; in the example, the code and calculations are not equivalent because in the traditional loop a temporary result is stored [see
num_list = [4, 11, 2, 19, 7, 6, 25, 12]
6 variable]. So, the list comprehension is doing much more internal operations [it calculates the tmp variable twice!, yet it is only 25% slower].

Danh sách Python hiểu được: Đơn, nhiều, lồng nhau, và hơn thế nữa

Cú pháp chung để hiểu danh sách trong Python là:

new_list = [x for x in old_list]

Chúng tôi đã có một danh sách các số gọi là

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
7, như sau:

num_list = [4, 11, 2, 19, 7, 6, 25, 12]

Sử dụng danh sách hiểu, chúng tôi muốn nối bất kỳ giá trị nào lớn hơn mười vào danh sách mới. Chúng ta có thể làm điều này như sau:list comprehension, we'd like to append any values greater than ten to a new list. We can do this as follows:

new_list = [num for num in num_list if num > 10]
new_list

Giải pháp này về cơ bản tuân theo quy trình tương tự như sử dụng vòng lặp

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
8 để thực hiện công việc, nhưng sử dụng danh sách hiểu thường có thể là một kỹ thuật gọn gàng và hiệu quả hơn. Ví dụ dưới đây cho thấy cách chúng tôi có thể tạo danh sách mới của mình bằng cách sử dụng vòng lặp
num_list = [4, 11, 2, 19, 7, 6, 25, 12]
8.

new_list = []
for num in num_list:
    if num > 10:
        new_list.append[num]
new_list

Sử dụng khả năng hiểu danh sách thay vì vòng lặp

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
8, chúng tôi đã quản lý để đóng gói bốn dòng mã thành một câu lệnh sạch.

Trong bài viết này, trước tiên chúng ta sẽ xem xét các cách khác nhau để sử dụng toàn bộ danh sách để tạo danh sách mới. Sau đó, chúng ta sẽ thấy những lợi ích của việc sử dụng toàn bộ danh sách là gì. Cuối cùng, chúng ta sẽ xem làm thế nào chúng ta có thể giải quyết nhiều toàn bộ danh sách.multiple list comprehensions.

Sự hiểu biết danh sách hoạt động bằng cách dịch các giá trị từ danh sách này sang danh sách khác bằng cách đặt câu lệnh

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
8 bên trong một cặp dấu ngoặc, chính thức gọi là biểu thức của trình tạo.generator expression.

Một trình tạo là một đối tượng có thể lặp lại, mang lại một loạt các giá trị. Hãy xem xét ví dụ sau, trong đó

new_list = [num for num in num_list if num > 10]
new_list
2 là trình tạo của chúng tôi và
new_list = [num for num in num_list if num > 10]
new_list
3 là sản lượng.generator is an iterable object, which yields a range of values. Let's consider the following example, where
new_list = [num for num in num_list if num > 10]
new_list
2 is our generator and
new_list = [num for num in num_list if num > 10]
new_list
3 is the yield.

num_list = [4, 11, 2, 19, 7, 6, 25, 12]

[num for num in num_list]

Out:

[4, 11, 2, 19, 7, 6, 25, 12]

Trong trường hợp này, Python đã lặp lại thông qua từng mục trong

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
7, tạm thời lưu trữ các giá trị bên trong biến
new_list = [num for num in num_list if num > 10]
new_list
3. Chúng tôi chưa thêm bất kỳ điều kiện nào vào danh sách hiểu, vì vậy tất cả các giá trị được lưu trữ trong danh sách mới.

Chúng ta hãy thử thêm vào câu lệnh

new_list = [num for num in num_list if num > 10]
new_list
6 để sự hiểu biết chỉ thêm các số lớn hơn bốn:

[num for num in num_list if num > 4]

Out:

[11, 19, 7, 6, 25, 12]

Hình ảnh dưới đây thể hiện quá trình theo sau trong danh sách hiểu biết trên:

Chúng tôi thậm chí có thể thêm vào một điều kiện khác để bỏ qua các số nhỏ hơn tám. Ở đây, chúng ta có thể sử dụng

new_list = [num for num in num_list if num > 10]
new_list
7 bên trong danh sách hiểu:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in [range[1000] for x in range[10000]]: tmp = list[i]; rr.append[min[tmp]];tt.append[max[tmp]]" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min[list[i]] for i in [range[1000] for x in range[10000]]];tt=[max[list[i]] for i in [range[1000] for x in range[10000]]]"
100 loops, best of 3: 413 msec per loop
0

Nhưng chúng tôi cũng có thể viết điều này mà không cần

new_list = [num for num in num_list if num > 10]
new_list
7 như:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in [range[1000] for x in range[10000]]: tmp = list[i]; rr.append[min[tmp]];tt.append[max[tmp]]" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min[list[i]] for i in [range[1000] for x in range[10000]]];tt=[max[list[i]] for i in [range[1000] for x in range[10000]]]"
100 loops, best of 3: 413 msec per loop
1

Khi sử dụng các điều kiện, Python kiểm tra xem câu lệnh

new_list = [num for num in num_list if num > 10]
new_list
6 của chúng tôi trả về
new_list = []
for num in num_list:
    if num > 10:
        new_list.append[num]
new_list
0 hoặc
new_list = []
for num in num_list:
    if num > 10:
        new_list.append[num]
new_list
1 cho mỗi sản lượng. Khi câu lệnh
new_list = [num for num in num_list if num > 10]
new_list
6 trả về
new_list = []
for num in num_list:
    if num > 10:
        new_list.append[num]
new_list
0, sản lượng được thêm vào danh sách mới.

Danh sách toàn diện không chỉ giới hạn trong việc lọc ra các giá trị danh sách không mong muốn, nhưng chúng tôi cũng có thể sử dụng chúng để áp dụng chức năng cho các giá trị được thêm vào. Ví dụ: giả sử chúng tôi muốn tạo một danh sách chứa các giá trị bình phương từ danh sách ban đầu:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in [range[1000] for x in range[10000]]: tmp = list[i]; rr.append[min[tmp]];tt.append[max[tmp]]" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min[list[i]] for i in [range[1000] for x in range[10000]]];tt=[max[list[i]] for i in [range[1000] for x in range[10000]]]"
100 loops, best of 3: 413 msec per loop
2

Out:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in [range[1000] for x in range[10000]]: tmp = list[i]; rr.append[min[tmp]];tt.append[max[tmp]]" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min[list[i]] for i in [range[1000] for x in range[10000]]];tt=[max[list[i]] for i in [range[1000] for x in range[10000]]]"
100 loops, best of 3: 413 msec per loop
3

Chúng tôi cũng có thể kết hợp bất kỳ chức năng bổ sung với các toán tử so sánh. Chúng tôi đã sử dụng rất nhiều từ

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
7, vì vậy hãy chuyển nó lên và bắt đầu sử dụng một danh sách khác cho các ví dụ của chúng tôi:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in [range[1000] for x in range[10000]]: tmp = list[i]; rr.append[min[tmp]];tt.append[max[tmp]]" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min[list[i]] for i in [range[1000] for x in range[10000]]];tt=[max[list[i]] for i in [range[1000] for x in range[10000]]]"
100 loops, best of 3: 413 msec per loop
4

Out:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in [range[1000] for x in range[10000]]: tmp = list[i]; rr.append[min[tmp]];tt.append[max[tmp]]" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min[list[i]] for i in [range[1000] for x in range[10000]]];tt=[max[list[i]] for i in [range[1000] for x in range[10000]]]"
100 loops, best of 3: 413 msec per loop
5

Trong ví dụ trên, danh sách hiểu danh sách của chúng tôi đã bình phương bất kỳ giá trị nào trong

new_list = []
for num in num_list:
    if num > 10:
        new_list.append[num]
new_list
5 rơi vào khoảng từ ba mươi đến năm mươi. Để giúp chứng minh những gì đang xảy ra ở trên, hãy xem sơ đồ dưới đây:

Danh sách hiểu cũng hoạt động với

new_list = []
for num in num_list:
    if num > 10:
        new_list.append[num]
new_list
6,
new_list = []
for num in num_list:
    if num > 10:
        new_list.append[num]
new_list
7 và
new_list = []
for num in num_list:
    if num > 10:
        new_list.append[num]
new_list
8.

Giống như trong ví dụ trên sử dụng

new_list = [num for num in num_list if num > 10]
new_list
7, chúng ta cũng có thể sử dụng
new_list = []
for num in num_list:
    if num > 10:
        new_list.append[num]
new_list
6:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in [range[1000] for x in range[10000]]: tmp = list[i]; rr.append[min[tmp]];tt.append[max[tmp]]" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min[list[i]] for i in [range[1000] for x in range[10000]]];tt=[max[list[i]] for i in [range[1000] for x in range[10000]]]"
100 loops, best of 3: 413 msec per loop
6

Sử dụng

new_list = []
for num in num_list:
    if num > 10:
        new_list.append[num]
new_list
7, chúng tôi cũng có thể kiểm tra các danh sách khác:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in [range[1000] for x in range[10000]]: tmp = list[i]; rr.append[min[tmp]];tt.append[max[tmp]]" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min[list[i]] for i in [range[1000] for x in range[10000]]];tt=[max[list[i]] for i in [range[1000] for x in range[10000]]]"
100 loops, best of 3: 413 msec per loop
7

Tương tự như vậy,

num_list = [4, 11, 2, 19, 7, 6, 25, 12]

[num for num in num_list]
2 cũng có thể:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in [range[1000] for x in range[10000]]: tmp = list[i]; rr.append[min[tmp]];tt.append[max[tmp]]" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min[list[i]] for i in [range[1000] for x in range[10000]]];tt=[max[list[i]] for i in [range[1000] for x in range[10000]]]"
100 loops, best of 3: 413 msec per loop
8

Out:

$ python3 -m timeit -n 100 -s 'rr=[];tt=[];' "for i in [range[1000] for x in range[10000]]: tmp = list[i]; rr.append[min[tmp]];tt.append[max[tmp]]" 
100 loops, best of 3: 314 msec per loop

$ python3 -m timeit -n 100 "rr=[min[list[i]] for i in [range[1000] for x in range[10000]]];tt=[max[list[i]] for i in [range[1000] for x in range[10000]]]"
100 loops, best of 3: 413 msec per loop
9

Cuối cùng, chúng ta có thể sử dụng các câu lệnh

new_list = [num for num in num_list if num > 10]
new_list
6 trước các biểu thức của máy phát trong danh sách hiểu. Bằng cách này, chúng ta có thể nói Python cách xử lý các giá trị khác nhau:before generator expressions within a list comprehension. By doing this, we can tell Python how to treat different values:

new_list = [x for x in old_list]
0

Out:

new_list = [x for x in old_list]
1

Ví dụ trên lưu trữ các giá trị trong danh sách mới của chúng tôi nếu chúng lớn hơn bốn mươi; Điều này được bao phủ bởi

num_list = [4, 11, 2, 19, 7, 6, 25, 12]

[num for num in num_list]
4. Python lưu trữ số 0 ở vị trí của chúng cho các giá trị không lớn hơn bốn mươi, theo hướng dẫn của
num_list = [4, 11, 2, 19, 7, 6, 25, 12]

[num for num in num_list]
5. Xem hình ảnh bên dưới để biết biểu diễn trực quan về những gì đang xảy ra:

Đương nhiên, bạn có thể muốn sử dụng một danh sách hiểu với hai danh sách cùng một lúc. Các ví dụ sau đây cho thấy các trường hợp sử dụng khác nhau cho nhiều danh sách hiểu.

Synax sau đây là phiên bản phổ biến nhất của nhiều danh sách hiểu, chúng tôi sẽ sử dụng để làm phẳng danh sách danh sách:

new_list = [x for x in old_list]
2

Out:

new_list = [x for x in old_list]
3

Thứ tự của các vòng lặp trong phong cách hiểu danh sách này có phần phản trực giác và khó nhớ, vì vậy hãy chuẩn bị để tìm kiếm nó một lần nữa trong tương lai! Bất kể, cú pháp cho danh sách làm phẳng là hữu ích cho các vấn đề khác sẽ yêu cầu kiểm tra hai danh sách cho các giá trị.

Chúng ta có thể sử dụng nhiều danh sách hiểu khi danh sách lồng nhau có liên quan. Giả sử chúng ta đã có một danh sách các danh sách có các giá trị loại chuỗi. Nếu chúng tôi muốn chuyển đổi các giá trị này từ loại chuỗi sang loại nguyên, chúng tôi có thể thực hiện việc này bằng cách sử dụng nhiều bộ hiểu danh sách như sau:

new_list = [x for x in old_list]
4

Out:

new_list = [x for x in old_list]
5

Vấn đề với việc sử dụng nhiều toàn bộ danh sách là chúng có thể khó đọc, khiến cuộc sống trở nên khó khăn hơn đối với các nhà phát triển khác và chính bạn trong tương lai. Để chứng minh điều này, đây là cách giải pháp đầu tiên trông như thế nào khi kết hợp khả năng hiểu danh sách với vòng lặp

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
8:

new_list = [x for x in old_list]
6

Out:

new_list = [x for x in old_list]
5

Giải pháp lai của chúng tôi không phải là kiểu dáng đẹp để nhìn vào, nhưng cũng dễ dàng hơn để chọn ra và tìm ra những gì xảy ra đằng sau hậu trường. Không có giới hạn về cách các toàn bộ danh sách sâu có thể đi. Nếu

num_list = [4, 11, 2, 19, 7, 6, 25, 12]

[num for num in num_list]
7 có nhiều danh sách được lồng trong danh sách lồng nhau của nó, chúng ta có thể thực hiện chuyển đổi số nguyên như sau:

new_list = [x for x in old_list]
8

Out:

new_list = [x for x in old_list]
9

Như ví dụ cho thấy, nhiều danh sách của chúng tôi giờ đã trở nên rất khó đọc. Người ta thường đồng ý rằng nhiều toàn bộ danh sách không nên đi sâu hơn hai cấp độ; Nếu không, nó có thể hy sinh rất nhiều khả năng đọc. Để chứng minh quan điểm, đây là cách chúng ta có thể sử dụng cho các vòng lặp thay vào đó để giải quyết vấn đề ở trên:multiple list comprehensions shouldn't go any deeper than two levels; otherwise, it could heavily sacrifice readability. To prove the point, here's how we could use for loops instead to solve the problem above:

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
0

Out:

new_list = [x for x in old_list]
9

Khi làm việc với các danh sách trong Python, bạn có thể thường thấy mình trong các tình huống mà bạn sẽ cần dịch các giá trị từ danh sách này sang danh sách khác dựa trên các tiêu chí cụ thể.

Nói chung, nếu bạn đang làm việc với các bộ dữ liệu nhỏ, thì sử dụng các vòng lặp

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
8 thay vì danh sách toàn diện không phải là kết thúc của thế giới. Tuy nhiên, khi kích thước của bộ dữ liệu của bạn bắt đầu tăng, bạn sẽ nhận thấy rằng làm việc thông qua danh sách một mục tại một thời điểm có thể mất nhiều thời gian.

Hãy tạo danh sách mười nghìn số ngẫu nhiên, từ giá trị từ một đến một triệu và lưu trữ cái này là

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
7. Sau đó, chúng ta có thể sử dụng vòng lặp
num_list = [4, 11, 2, 19, 7, 6, 25, 12]
8 và khả năng hiểu danh sách để tạo danh sách mới chứa các giá trị
num_list = [4, 11, 2, 19, 7, 6, 25, 12]
7 lớn hơn nửa triệu. Cuối cùng, sử dụng
[4, 11, 2, 19, 7, 6, 25, 12]
2, chúng ta có thể so sánh tốc độ của hai cách tiếp cận:

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
2

Giải pháp hiểu danh sách chạy nhanh gấp đôi, do đó, nó không chỉ sử dụng ít mã hơn mà còn nhanh hơn nhiều. Với ý nghĩ đó, cũng đáng chú ý là các vòng lặp ____38 có thể dễ đọc hơn nhiều trong một số tình huống, chẳng hạn như khi sử dụng nhiều toàn bộ danh sách.

Cuối cùng, nếu bạn đang ở vị trí yêu cầu nhiều danh sách, tùy thuộc vào bạn nếu bạn muốn ưu tiên hiệu suất hơn khả năng đọc.

Danh sách toàn diện là một công cụ tuyệt vời để tạo danh sách mới dựa trên các yêu cầu của bạn. Chúng nhanh hơn nhiều so với việc sử dụng vòng lặp

num_list = [4, 11, 2, 19, 7, 6, 25, 12]
8 và có thêm lợi ích là làm cho mã của bạn trông gọn gàng và chuyên nghiệp.

Đối với các tình huống bạn làm việc với danh sách lồng nhau, nhiều toàn bộ danh sách cũng có sẵn cho bạn. Khái niệm sử dụng toàn bộ ban đầu có vẻ hơi phức tạp, nhưng một khi bạn đã quấn đầu quanh chúng, bạn sẽ không bao giờ nhìn lại!

Danh sách hiểu có thể trả về hai danh sách?

Câu hỏi là: 'Có thể trả về hai danh sách từ một danh sách hiểu không? '. Tôi trả lời rằng điều đó là có thể, nhưng theo tôi là tốt hơn để lặp lại với một vòng lặp và thu thập kết quả trong hai danh sách riêng biệt.it is possible, but in my opinion is better to iterate with a loop and collect the results in two separate lists.

Bạn có thể trả lại một danh sách Python không?

Danh sách toàn diện không thể chứa các câu lệnh, chỉ biểu thức.Trên thực tế, điều đó đúng với tất cả các biểu thức trong Python: chúng chỉ có thể chứa các biểu thức khác.Vì vậy, không, bạn không thể trả lại trong một danh sách hiểu.no, you can't put a return inside a list comprehension.

Bạn có thể làm tổ danh sách toàn diện?

Hóa ra, bạn có thể làm tổ danh sách các toàn bộ trong danh sách khác để giảm thêm mã của bạn và giúp bạn dễ đọc hơn.Như một vấn đề thực tế, không có giới hạn về số lượng toàn bộ bạn có thể làm tổ trong nhau, điều này có thể viết mã rất phức tạp trong một dòng.you can nest list comprehensions within another list comprehension to further reduce your code and make it easier to read still. As a matter of fact, there's no limit to the number of comprehensions you can nest within each other, which makes it possible to write very complex code in a single line.

Danh sách hiểu có luôn trả về một danh sách không?

Không giống như với các vòng lặp, danh sách toàn diện tự động đưa đầu ra của chúng vào danh sách.Trong đoạn trích đầu tiên, chúng ta phải tạo rõ ràng một danh sách mới và sau đó nối vào nó bên trong vòng lặp.list comprehensions automatically put their output into a list. In the first snippet, we have to explicitly create a new list and then append to it inside the for loop.

Bài Viết Liên Quan

Chủ Đề