Cách nối các phần tử của danh sách trong Python

Các trường hợp cạnh dưới đây tốt hơn trong một số trường hợp, nhưng

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
5 nói chung là lựa chọn tốt nhất. Tất cả các tùy chọn được đề cập đều hoạt động trong Python 2. 3, Trăn 2. 7 và tất cả các phiên bản Python 3

Kết hợp các danh sách tại chỗ trong Python

Vấn đề. Bạn có một danh sách lớn và bạn muốn thêm một danh sách nhỏ hơn vào cuối trong khi giảm thiểu việc sử dụng bộ nhớ

Trong trường hợp này, tốt nhất bạn nên thêm vào danh sách hiện có, sử dụng lại danh sách đó thay vì tạo lại danh sách mới

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]

Như với bất kỳ tối ưu hóa nào, bạn nên xác minh rằng điều này làm giảm sự cố bộ nhớ trong trường hợp cụ thể của bạn và tuân theo thành ngữ đơn giản

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
8 nếu không thì

Hãy sử dụng mô-đun

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
9 để kiểm tra một số con số hiệu suất

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804

Trong ví dụ này, trong đó x là 3000 phần tử, phần mở rộng nhanh hơn khoảng 50 lần

❗ Nối các danh sách với các phần tử lớn là tốt

Nếu các phần tử trong danh sách của bạn rất lớn [hàng triệu chuỗi ký tự], nhưng kích thước danh sách nhỏ hơn một nghìn phần tử, thì giải pháp trước đó

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
8 sẽ hoạt động tốt. Điều này là do Python lưu trữ các tham chiếu đến các giá trị trong danh sách chứ không phải chính các giá trị đó. Do đó, kích thước phần tử không tạo ra sự khác biệt đối với độ phức tạp thời gian chạy

>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365

Trong trường hợp này,

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
1 không có lợi thế

Tránh chuỗi từ
# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
2 cho hai danh sách

Có thể sử dụng

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
3 từ
# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
2 để tạo một danh sách có thể lặp lại gồm hai danh sách

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
1

Chúng tôi có thể kiểm tra hiệu suất của việc sử dụng chuỗi

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
2

Sử dụng

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
3 với hai danh sách sẽ chậm hơn trong mọi trường hợp được kiểm tra và
>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
8 dễ hiểu hơn

Kết hợp N Danh sách trong Python

Nếu bạn cần thêm ba hoặc thậm chí mười danh sách lại với nhau và các danh sách này được biết tĩnh, thì

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
5 để ghép nối hoạt động rất tốt

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
6

Làm phẳng một danh sách các danh sách trong Python

Tuy nhiên, nếu số lượng danh sách là động và không xác định cho đến thời gian chạy, thì

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
3 từ
# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
2 trở thành một lựa chọn tuyệt vời. Chuỗi lấy một danh sách các danh sách và làm phẳng nó thành một danh sách duy nhất

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
9

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
3 có thể lấy bất kỳ thứ gì có thể lặp lại, làm cho nó trở thành một lựa chọn tuyệt vời để kết hợp danh sách, từ điển và các cấu trúc có thể lặp lại khác

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
1

Hiệu suất làm phẳng một danh sách các danh sách

Hiệu suất không phải lúc nào cũng quan trọng, nhưng khả năng đọc luôn quan trọng và phương pháp chuỗi là một cách đơn giản để kết hợp danh sách các danh sách. Điều đó nói rằng, hãy tạm gác khả năng đọc sang một bên và cố gắng tìm cách nhanh nhất để làm phẳng danh sách

Một lựa chọn là lặp đi lặp lại chính chúng ta

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
2

Hãy kiểm tra hiệu suất của nó so với chuỗi

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
0

Điều này cho thấy rằng

>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365
1 nhanh hơn mở rộng

Làm phẳng và hợp nhất danh sách với một danh sách lớn

Điều gì về việc thêm một danh sách các danh sách vào một danh sách lớn hiện có?

Đầu tiên, chúng tôi sử dụng tiêu chuẩn của chúng tôi

>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365
1

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
1

Sau đó chúng tôi kiểm tra hiệu suất của nó

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
2

Tiếp theo, hãy thử nối bằng cách thêm mọi thứ vào danh sách dài

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
3

Kiểm tra hiệu suất

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
4

Vậy là xong,

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
1 nhanh hơn nhiều khi làm phẳng danh sách hoặc nối nhiều danh sách với một danh sách dài. Nếu bạn gặp phải điều này, sử dụng
# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
1 để thêm các danh sách nhỏ hơn vào danh sách dài có thể giảm bớt công việc phải hoàn thành và tăng hiệu suất

Tóm lược

Đây là những biến thể chính của việc kết hợp danh sách trong python. Sử dụng bảng này để hướng dẫn bạn trong tương lai

Ngoài ra, nếu bạn đang tìm kiếm một cách hay để chuẩn hóa các quy trình xung quanh dự án python của mình – chạy thử nghiệm, cài đặt phần phụ thuộc và mã linting – hãy xem Earthly for Repeatable Builds

Điều kiệnGiải phápTối ưu hóa hiệu suất2 danh sách
>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
8Không có 1 danh sách lớn, 1 danh sách nhỏ
>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365
7CóSố lượng danh sách N đã biết
>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365
8KhôngSố lượng danh sách N không xác định
>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365
9Không có danh sách các danh sách
>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365
9Không có 1 danh sách lớn, nhiều danh sách nhỏ
>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
11Có
  1. Tôi đã thực hiện tất cả các bài kiểm tra hiệu năng bằng Python 3. 9. 5 trên MacOS BigSur

  2. Nếu bạn không có nút cổ chai về hiệu suất, hiệu suất rõ ràng sẽ vượt trội và bạn nên bỏ qua các đề xuất về hiệu suất

Chủ Đề