Hướng dẫn python list comprehension split list - danh sách phân chia hiểu danh sách python

Tôi đang cố gắng tìm hiểu xem có cách nào để phân chia giá trị của từng lần lặp của một danh sách hiểu chỉ một lần nhưng sử dụng nó hai lần trong đầu ra.

Như một ví dụ về vấn đề tôi đang cố gắng giải quyết là, tôi có chuỗi:

a = "1;2;4\n3;4;5"

Và tôi muốn thực hiện điều này:

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]

Không cần chạy chia tách ba lần. Vì vậy, một cái gì đó như thế này (rõ ràng là cú pháp không hợp lệ nhưng hy vọng là đủ để có được thông điệp):

[(x[1],x[2]) for x.split(";") in a.split("\n") if x[1] != 5]

Trong câu hỏi này, tôi không tìm kiếm những cách ưa thích để có được cột thứ 2 và thứ 3 của chuỗi. Nó chỉ là một cách cung cấp một ví dụ cụ thể. Tôi có thể cho khóa học sử dụng ví dụ:not looking for fancy ways to get the 2nd and 3rd column of the string. It is just a way of providing a concrete example. I could for course for the example use:

[x.split(";")[1:3] for x in a.split("\n")]

Các giải pháp khả thi mà tôi đã nghĩ đến:

  1. Không sử dụng danh sách hiểu biết
  2. Để nó như là
  3. Sử dụng
    >>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
    [('2', '4'), ('4', '5')]
    
    1, đặt tên cho các cột của tôi và một cái gì đó như
    >>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
    [('2', '4'), ('4', '5')]
    
    2 để cung cấp cho nó đầu vào.

Đây chủ yếu là một thứ gì đó sẽ là một mô hình tốt để có thể sử dụng hơn là một trường hợp cụ thể để khó trả lời "Tại sao bạn muốn làm điều này" hoặc "Điều này là gì cho" loại câu hỏi

Cập nhật: Sau khi đọc giải pháp dưới đây, tôi đã đi và chạy một số bài kiểm tra tốc độ. Và tôi đã tìm thấy trong các thử nghiệm rất cơ bản của mình rằng giải pháp được cung cấp nhanh hơn 35% so với giải pháp ngây thơ ở trên. After being reading the solution below I went and ran some speed tests. And I found in my very basic tests that the solution provided was 35% faster than the naive solution above.

Chia các yếu tố của một danh sách trong Python #

Để phân chia các yếu tố của một danh sách trong Python:

  1. Sử dụng danh sách hiểu để lặp lại trong danh sách.
  2. Trên mỗi lần lặp, hãy gọi phương thức
    >>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
    [('2', '4'), ('4', '5')]
    
    3 để phân chia từng chuỗi.
  3. Trả về một phần của mỗi chuỗi bạn muốn giữ.

Copied!

my_list = ['a-1', 'b-2', 'c-3', 'd-4'] # ✅ split each element in list and keep first part result_1 = [item.split('-', 1)[0] for item in my_list] print(result_1) # 👉️ ['a', 'b', 'c', 'd'] # ✅ split each element in list into nested lists result_2 = [item.split('-') for item in my_list] print(result_2) # 👉 [['a', '1'], ['b', '2'], ['c', '3'], ['d', '4']] # ✅ split each element in list and flatten list result_3 = [item.split('-') for item in my_list] result_3_flat = [item for l in result_3 for item in l] print(result_3_flat) # 👉️ ['a', '1', 'b', '2', 'c', '3', 'd', '4'] # ✅ split specific element in list result_4 = my_list[0].split('-') print(result_4) # 👉️ ['a', '1']

Ví dụ đầu tiên cho thấy cách phân chia từng phần tử trong danh sách và chỉ giữ phần đầu tiên.

Copied!

my_list = ['a-1', 'b-2', 'c-3', 'd-4'] # ✅ split each element in list and keep first part result_1 = [item.split('-', 1)[0] for item in my_list] print(result_1) # 👉️ ['a', 'b', 'c', 'd']

Chúng tôi đã sử dụng một danh sách hiểu để lặp lại trong danh sách.

Danh sách các hệ thống được sử dụng để thực hiện một số hoạt động cho mọi yếu tố hoặc chọn một tập hợp con của các phần tử đáp ứng một điều kiện.

Phương thức str.split () chia chuỗi thành một danh sách các chuỗi con bằng cách sử dụng dấu phân cách.

Phương thức lấy 2 tham số sau:

TênSự mô tả
máy tách biệtChia chuỗi thành chuỗi con trên mỗi lần xuất hiện
MaxSplitNhiều nhất
>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
4 chia tách được thực hiện (tùy chọn)

Chúng tôi đã vượt qua

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
5 cho đối số
>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
4 để chỉ chia chuỗi một lần và nhận mục đầu tiên.

Nếu bạn cần chia chuỗi trên mỗi lần xuất hiện của dấu phân cách, hãy xóa đối số thứ hai trong cuộc gọi đến

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
7.

Copied!

# 👇️ ['a', 'b.c.d'] print('a.b.c.d'.split('.', 1)) # 👈️ with maxsplit set to 1 # 👇️ ['a', 'b', 'c', 'd'] print('a.b.c.d'.split('.')) # 👈️ without maxsplit

Ví dụ thứ hai chia từng phần tử trong danh sách thành danh sách lồng nhau.

Copied!

my_list = ['a-1', 'b-2', 'c-3', 'd-4'] # ✅ split each element in list into nested lists result_2 = [item.split('-') for item in my_list] print(result_2) # 👉 [['a', '1'], ['b', '2'], ['c', '3'], ['d', '4']]

Bạn cũng có thể làm phẳng danh sách sau khi bạn chia từng chuỗi.

Copied!

my_list = ['a-1', 'b-2', 'c-3', 'd-4'] # ✅ split each element in list and flatten list result_3 = [item.split('-') for item in my_list] result_3_flat = [item for l in result_3 for item in l] print(result_3_flat) # 👉️ ['a', '1', 'b', '2', 'c', '3', 'd', '4']

Biến

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
8 là một danh sách hai chiều, vì vậy chúng tôi đã phải sử dụng một danh sách hiểu khác để làm phẳng nó.

Bạn có thể đạt được kết quả tương tự bằng cách sử dụng vòng lặp

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
9.

Copied!

my_list = ['a-1', 'b-2', 'c-3', 'd-4'] # ✅ split each element in list and flatten list result_3 = [item.split('-') for item in my_list] print(result_3) # 👉️ [['a', '1'], ['b', '2'], ['c', '3'], ['d', '4']] result_3_flat = [] for l in result_3: for item in l: result_3_flat.append(item) # 👇️ ['a', '1', 'b', '2', 'c', '3', 'd', '4'] print(result_3_flat)

Chúng tôi đã sử dụng một vòng lặp

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
9 để làm phẳng danh sách các danh sách.

Vòng lặp

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
9 bên ngoài được sử dụng để lặp lại trong danh sách hai chiều.

Để có được quyền truy cập vào các mục trong danh sách lồng nhau, chúng tôi cần một vòng lặp

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
9 lồng nhau.

Trên mỗi lần lặp, chúng tôi nối từng mục danh sách vào một danh sách trống.

Nếu bạn cần chia một mục danh sách, hãy truy cập danh sách theo chỉ mục cụ thể trước khi gọi phương thức

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
3.

>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
0

Các chỉ mục dựa trên không trong Python, vì vậy mục đầu tiên trong danh sách có chỉ mục là

[(x[1],x[2]) for x.split(";") in a.split("\n") if x[1] != 5]
4, chỉ số thứ hai là
>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
5, v.v.

Bạn có thể chia () một danh sách trong Python không?

Phương thức phân chia chuỗi python () Phương thức phân tách một chuỗi thành một danh sách.Bạn có thể chỉ định phân tách, dấu phân cách mặc định là bất kỳ khoảng trắng nào.Lưu ý: Khi MaxSplit được chỉ định, danh sách sẽ chứa số lượng phần tử được chỉ định cộng với một.The split() method splits a string into a list. You can specify the separator, default separator is any whitespace. Note: When maxsplit is specified, the list will contain the specified number of elements plus one.

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ể 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.