Tất tần tật về các cách merge list trong Python

481

Tác giả: Indhumanthy Chelliah

Qua bài viết này hãy tìm hiểu nhiều cách làm khác nhau để merge các list trong Python.

List trong Python là gì?

Python biết được 1 số loại dữ liệu phức hợp, vốn được dùng để group các giá trị khác lại cùng nhau. Và cách linh hoạt nhất chính là list, có thể được viết dưới dạng 1 list các giá trị (hay item) được phân tách bằng dấu phẩy giữa các dấu ngoặc vuông. Các list có thể chứa các loại item khác nhau, nhưng thông thường tất cả item đều có cùng 1 loại.

  Merge vs Rebase trong Git
  20 tài liệu học Python thiết thực để trở thành lập trình viên chuyên nghiệp

Các cách khác nhau để hợp nhất danh sách – merge list:

các cách merge list trong Python

1. append – nối thêm

– Phương pháp append sẽ thêm 1 item tới cuối list.
– Độ dài của list sẽ tăng lên 1.
– Nó sẽ tự cập nhật list gốc.
– Loại return là None.

l1=[1,2,3]
l2=[4,5,6]
l1.append(l2)
print (l1)
#Output:[1, 2, 3, [4, 5, 6]]

2. extend – mở rộng

– Phương pháp extend sẽ mở rộng list bằng cách nối tất cả các item từ iterable.
– Độ dài của list sẽ được tăng lên phụ thuộc vào độ dài của iterable.
– Nó sẽ tự cập nhật list gốc cho mình.
– Loại return là None.

l1=[1,2,3]
l2=[4,5,6]
l1.extend(l2)
print (l1)
#Output:[1, 2, 3, 4, 5, 6]

3. concatenation – kết hợp

– List cũng hỗ trợ cho concatenation operations – các toán tử kết hợp. 
– Chúng ta có thể thêm 2 hay nhiều list hơn bằng cách dùng toán tử +
– Nó sẽ không cập nhật list gốc.
– Loại return là 1 list object mới.

Ví dụ 1: Concatenating 2 list

l1=[1,2,3]
l2=[4,5,6]
l3=l1+l2
print (l3)
#Output:[1, 2, 3, 4, 5, 6]

Ví dụ 2: Concatenating 2 hay nhiều hơn 2 list:

l1=[1,2,3]
l2=[4,5,6]
l3=[7,8]
l4=[9,10]
l5=l1+l2+l3+l4
print (l5)
#Output:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

4. Unpacking – giải nén

Dấu hoa thị * biểu thị việc giải nén các iterable. Toán hạng của nó phải thuộc dạng iterable. Iterable được mở rộng thành 1 chuỗi các item, được đặt trong tuple, list, hay set mới tại vị trí giải nén.

list1=[*list2,*list3]

Đầu tiên, nó sẽ giải nén phần nội dung và rồi tạo 1 list từ những nội dung đó.

l1=[1,2,3]
l2=[4,5,6]
l3=[*l1,*l2]
print (l3)
#Output:[1, 2, 3, 4, 5, 6]

5. itertools.chain

Hãy tạo 1 iterator để trả về từng phần tử từ iterable đầu tiên cho tới hết, sau đó chuyển sang iterable tiếp theo. Nó sẽ xem các chuỗi liên tiếp như là 1 chuỗi đơn. 

itertools.chain(*iterables)

List cũng là iterable, nên chúng ta có thể dùng itertools.chain() để merge 2 dictionaries lại. Loại return sẽ là đối tượng itertools.chain. Chúng ta có thể convert tới 1 list bằng cách dùng constructor list(). 

import itertools
l1=itertools.chain([1,2,3],[4,5,6])
#Returns an iterator object
print (l1)#Output:<itertools.chain object at 0x029FE4D8>
#converting iterator object to list object
print(list(l1))#Output:[1, 2, 3, 4, 5, 6]

6. List comprehension

1 list comprehension bao gồm dấu ngoặc [] chứa 1 biểu thức – expression được theo sau bởi 1 mệnh đề for, rồi tới 0 hay nhiều mệnh đề for hay if. Kết quả sẽ là 1 list mới mang kết quả từ việc đánh giá biểu thức trong ngữ cảnh của mệnh đề forif theo sau nó. 

[expression for item in iterable if conditional]

Ví dụ 1: Joining 2 list bằng cách dùng list comprehension

l1=[1,2,3]
l2=[4,5,6]
l3=[x for n in (l1,l2) for x in n]
print (l3)#Output:[1, 2, 3, 4, 5, 6]

7. for loop

– for loop đầu tiên là để đi qua các list (for n in (l1,l2)
– for loop thứ hai là để đi qua các phần tử trong list (for x in n)
– Sau đó nó sẽ append mỗi phần tử tới list trống được tạo ra trước l3

l1=[1,2,3]
l2=[4,5,6]
l3=[]
for n in (l1,l2):
    for x in n:
        l3.append(x)
print (l3)
#Output:[1, 2, 3, 4, 5, 6]

———

Cách để join tất cả các chuỗi (string) trong 1 list:

str.join(iterable)

Return 1 chuỗi vốn là concatenation của các chuỗi trong iterable. 1 TypeError sẽ được trả ra nếu có bất kỳ giá trị không phải là chuỗi (non-string values) nào trong iterable, bao gồm các đối tượng bytes. Separator giữa các phần tử chính là chuỗi cung cấp phương thức này. 

Ví dụ 1: Join tất cả các chuỗi trong list. Separator được cho là khoảng trắng (space)

l1=["Welcome", "to", "python", "programming", "language"]
l2=" ".join(l1)
print (l2)
#Output:
Welcome to python programming language

Ví dụ 2: Join tất cả các chuỗi trong list. Separator được cho là -

l1=["1","2","3"]
l2="-".join(l1)
print (l2)
#Output:1-2-3

———

Cách để gỡ bỏ các phần tử trùng lặp trong lúc merging 2 list:

Các set Python không chứa các phần tử trùng lặp.
Để gỡ bỏ các phần tử trùng lặp từ các list ta có thể convert list thành set bằng cách dùng set() và rồi convert ngược lại tới list bằng cách dùng constructor list().

l1=[1,2,3,4,5]
l2=[1,3,5,7,9]
l3=list(set(l1+l2))
print (l3)
#Output:[1, 2, 3, 4, 5, 7, 9]
———-

Cách nhanh nhất để merge các list trong Python

time.time() → float

Return thời gian tính bằng giây bởi vì epoch như 1 số thực dấu phẩy động (a floating-point number). Epoch chính là điểm nơi thời gian bắt đầu và phụ thuộc vào nền tảng (platform dependent). Date cụ thể của epoch và việc xử lý giây nhuận cũng phụ thuộc vào nền tảng.

Tính thời gian thực hiện bằng phương pháp append

import time
l1=list(range(1,1000000))
l2=list(range(1000000,2000000))
start=time.time()
l1.append(l2)
print (time.time()-start)
#Output:0.0019817352294921875

Tính thời gian thực hiện để merge các list bằng cách dùng phương pháp extend

import time
l1=list(range(1,1000000))
l2=list(range(1000000,2000000))
start1=time.time()
l1.extend(l2)
print (time.time()-start1)
#Output:0.00701141357421875

Tính thời gian thực hiện để join các list bằng cách dùng toán tử concatenation

import time
l1=list(range(1,1000000))
l2=list(range(1000000,2000000))
start2=time.time()
l1+l2
print (time.time()-start2)
#Output:0.014112710952758789

Tính thời gian thực hiện để merge các list bằng cách dùng phương pháp giải nén – unpacking

import time
l1=list(range(1,1000000))
l2=list(range(1000000,2000000))
start3=time.time()
[*l1,*l2]
print (time.time()-start3)
#Output:0.020873069763183594

Tính thời gian thực hiện để merge các list bằng cách dùng intertools.chain()

import itertools
import time
l1=list(range(1,1000000))
l2=list(range(1000000,2000000))
start4=time.time()
l3=itertools.chain(l1,l2)
list(l3)
print (time.time()-start4)
#Output:0.045874595642089844

Tính thời gian thực hiện để merge các list bằng cách dùng list comprehension

import time
l1=list(range(1,1000000))
l2=list(range(1000000,2000000))
start5=time.time()
l3=[x for n in (l1,l2) for x in n]
print (time.time()-start5)
#Output:0.06680965423583984

Tính thời gian thực hiện để merge các list bằng cách dùng for loop

import time
l1=list(range(1,1000000))
l2=list(range(1000000,2000000))
start5=time.time()
l3=[]
for n in (l1,l2):
    for x in n:
        l3.append(x)
print (time.time()-start5)
#Output:0.23975229263305664

Hãy so sánh thời gian thực hiện bằng tất cả các phương pháp để merge các list:

các cách merge list trong Python 1

Kết luận:

Phương pháp append sẽ thêm list như 1 phần tử tới 1 list khác. Độ dài của list sẽ được tăng lên 1 chỉ sau khi appending 1 list.

Phương pháp extend sẽ mở rộng list bằng cách appending tất cả các item từ iterable(list khác). Độ dài của list sẽ được tăng lên tùy thuộc vào độ dài của iterable.

– Cả 2 phương pháp append và extend sẽ sửa đổi list gốc ban đầu.

Concatenation, giải nén, list comprehension return 1 đối tượng list mới. Nó sẽ không sửa đổi list gốc ban đầu.

itertools.chain() – Loại return sẽ là đối tượng itertools.chain. Chúng ta có thể convert tới 1 list bằng cách dùng constructor list().
_________

Các nguồn tài nguyên bạn có thể tham khảo:

1. An Informal Introduction to Python – Python 3.8.5 documentation
https://docs.python.org/3/tutorial/introduction.html#lists

2. Data Structures – Python 3.8.5 documentation
https://docs.python.org/3/tutorial/datastructures.html#more-on-lists

3. Expressions – Python 3.8.5 documentation
https://docs.python.org/3/reference/expressions.html#exprlists

4. What’s New In Python 3.5 – Python 3.8.5 documentation
https://docs.python.org/3/whatsnew/3.5.html#pep-448-additional-unpacking-generalizations

5. What is the fastest way to merge two lists in Python?
https://stackoverflow.com/questions/17044508/what-is-the-fastest-way-to-merge-two-lists-in-python

Có thể bạn quan tâm:

Bài viết gốc được đăng tại Medium

Xem thêm việc làm Python hấp dẫn tại TopDev

Báo cáo bài viết vi phạm bản quyền>>