Python itertools groupby nhiều khóa

def split_comp(compstr). """ Tách một chuỗi chứa thành phần của dung dịch rắn perovskite thành các thành phần của nó Thành phần hóa học. (am_1, am_2)(tm_1, tm_2)Sửu. tham số compstr. thành phần như một chuỗi. trở về. sáng_1, sáng_2, sáng_1, sáng_2; . e. ("Fe", 0. 6) """ am_1, am_2, tm_1, tm_2 = Không, Không, Không, Không compstr_spl = ["". tham gia (g) cho _, g trong nhóm (str (compstr), str. isalpha)] cho l trong phạm vi(len(compstr_spl)). thử. nếu ( ptable. Phần tử(compstr_spl[l]). is_alkaline hoặc ptable. Phần tử(compstr_spl[l]). is_alkali hoặc ptable. Phần tử(compstr_spl[l]). is_rare_earth_metal ). nếu am_1 là Không có. am_1 = [compstr_spl[l], float(compstr_spl[l + 1])] elif am_2 là Không có. am_2 = [compstr_spl[l], float(compstr_spl[l + 1])] nếu ptable. Phần tử(compstr_spl[l]). is_transition_metal và không ( ptable. Phần tử(compstr_spl[l]). is_rare_earth_metal ). nếu tm_1 là Không có. tm_1 = [compstr_spl[l], float(compstr_spl[l + 1])] elif tm_2 là Không có. tm_2 = [compstr_spl[l], float(compstr_spl[l + 1])] # phép cân bằng hóa học tăng ValueErrors trong pymatgen. is_alkaline, v.v. , hãy bỏ qua những lỗi này và bỏ qua mục đó ngoại trừ ValueError. vượt qua trở lại am_1, am_2, tm_1, tm_2

Hàm itertools trong Python cung cấp một cách hiệu quả để lặp danh sách, bộ dữ liệu và từ điển. itertools. chức năng groupby trong itertools sẽ được áp dụng trong hướng dẫn này để nhóm danh sách từ điển theo một khóa cụ thể

Để minh họa cách thức hoạt động của tính năng này, chúng ta sẽ xem danh sách thông tin về sinh viên (trong từ điển) và cố gắng nhóm những thông tin này theo khóa “lớp”, chẳng hạn như…

Vì vậy, bạn muốn tìm hiểu về itertools. groupby(), thì bạn đang ở đúng nơi. itertools. groupby() là một phần của itertools mô-đun python, một tập hợp các công cụ được sử dụng để xử lý các trình vòng lặp. Tất cả các phương thức/công cụ của itertools tạo nên đại số của iter. Itertools sẽ làm cho mã của bạn nổi bật. Trên hết, nó sẽ làm cho nó trở nên Pythonic hơn

Người ta sẽ đặt câu hỏi về sự cần thiết của itertools. Chúng nhanh hơn và hiệu quả hơn nhiều về bộ nhớ trên các cấu trúc dữ liệu có thể lặp lại

Các itertools có các loại sau

  • Trình vòng lặp vô hạn
  • Chấm dứt vòng lặp
  • vòng lặp tổ hợp

Mặc dù thư viện itertools chứa nhiều chức năng có giá trị, nhưng trong bài viết này, chúng tôi sẽ tập trung vào itertools. groupby() để chấm dứt trình vòng lặp, bạn có thể xem các phương pháp khác tại đây

nội dung

  • giải mã itertools. theo nhóm ()
  • Nhập itertools. theo nhóm ()
  • cú pháp
  • Các thông số của itertools. theo nhóm ()
  • loại trả lại
  • phức tạp
  • Ví dụ cho itertools. theo nhóm ()
    • ví dụ 1
    • ví dụ 2
  • Ví dụ thực tế về groupby
  • itertools. nhóm trên mảng 2-D
  • Câu hỏi thường gặp trên itertools. theo nhóm ()
  • Sự kết luận
  • Xu hướng bài viết Python

giải mã itertools. theo nhóm ()

Phương thức groupby() của itertools đi qua một giá trị có thể lặp lại và nhóm dựa trên một khóa cụ thể. Sau đó, nó trả về một iterator(stream of tuples)

Giá trị đầu tiên của bộ bao gồm các khóa, trên đó các mục của iterable được nhóm lại. Giá trị thứ hai của tuple sẽ là một trình vòng lặp chứa tất cả các mục được nhóm theo khóa.

Nếu bạn cảm thấy có quá nhiều thứ để tiếp nhận, đừng lo lắng;

Nhập itertools. theo nhóm ()

# want to use it like itertools.groupby()
import itertools

# want to use directly
from itertools import groupby

cú pháp

itertools.groupby(iterable,keyfunc)

Các thông số của itertools. theo nhóm ()

  1. lặp đi lặp lại. Iterables là các đối tượng tạo ra một iterator. Chẳng hạn, python iterable phổ biến là danh sách, bộ dữ liệu, chuỗi, từ điển. itertools. groupby() nhóm các phần tử của iterable lại với nhau
  2. phím chức năng. Hàm tính toán danh mục nhóm cho từng phần tử. Nếu chức năng chính không được chỉ định hoặc Không có, thì chính phần tử đó được sử dụng để nhóm

Ghi chú. itertools. groupby() thu thập các mục liền kề với nhau bằng cùng một khóa. Nói cách khác, việc sắp xếp các lần lặp lại của bạn sẽ giúp bạn tránh khỏi mọi sự khác biệt

loại trả lại

itertools. groupby() trả về một trình vòng lặp với các luồng bộ dữ liệu bên trong

Python itertools groupby nhiều khóa
Trình lặp

phức tạp

itertools. groupby() có độ phức tạp thời gian O(n)

Ví dụ cho itertools. theo nhóm ()

ví dụ 1

Hãy bắt đầu với một ví dụ cơ bản nhất

import itertools

string = 'aaaabbbbbbcccdddddd'
string_tuple = itertools.groupby(string)
print(string_tuple, type(string_tuple))

Hãy xem qua đoạn mã trên

  • Trong đoạn mã trên, chúng ta có biến chuỗi dưới dạng có thể lặp lại, chúng ta đã lấy một chuỗi đã được sắp xếp
  • Sau khi chuyển chuỗi tới itertools. groupby(), chúng ta có một iterator mà chúng ta đã lưu trữ trong biến string_tuple
Python itertools groupby nhiều khóa
trình lặp đã tạo

for item in string_tuple:
    print(item)

  • Chúng tôi lặp lại bộ lặp string_tuple, lưu ý các bộ dữ liệu được trả về, giá trị đầu tiên là khóa và giá trị thứ hai là bộ lặp;
Python itertools groupby nhiều khóa
Tuple trả về phép lặp qua trình lặp string_tuple

for key, iter_item in string_tuple:
    print(f"Key:{key}")
    for item in iter_item:
        print(item,end=" ")
    print()

  • Lưu ý trong đầu ra bên dưới;
Python itertools groupby nhiều khóa
Các phần tử có thể lặp lại được nhóm lại với nhau theo phương thức groupby

Phổ biến bây giờ

Hướng dẫn cơ bản về Python __all__

ví dụ 2

Hãy lấy một ví dụ;

import itertools

anagrams =['angel','below','glean','bored','robed','study','dusty','cat','act','inch','chin','taste','state','elbow']
grouped_anagrams = [list(group) for key, group in itertools.groupby(sorted(anagrams, key=sorted),sorted)]
print(grouped_anagrams)

Python itertools groupby nhiều khóa
đầu ra. đảo chữ được nhóm bằng cách sử dụng itertools. theo nhóm ()

Hãy chia nhỏ mã được cung cấp ở trên

  • Chúng ta có 7 cặp đảo chữ được lưu trữ trong biến có tên đảo chữ
  • Sử dụng hiểu danh sách, như được hiển thị ở trên, chúng tôi đã lưu danh sách đảo chữ được nhóm vào biến có tên grouped_anagrams
  • Ở đây (xem đoạn mã trên), hàm sorted lấy trong danh sách đảo chữ cái, sắp xếp chúng theo các đối tượng đảo chữ phù hợp
  • Ví dụ, nhìn vào hình ảnh dưới đây
Python itertools groupby nhiều khóa
đã sắp xếp (đảo chữ cái, khóa = đã sắp xếp);
  • Một lần nữa, sorted được truyền dưới dạng keyfunc trong phương thức groupby, phương thức này trả về một khóa được nhóm trên
  • Nói cách khác, 'cat' và 'act' trả về cùng một khóa là ['a', 'c', 't']. Do đó, chúng được nhóm lại với nhau
  • Tương tự, phương pháp groupby ghép 6 cặp đảo ngữ còn lại
  • Hình ảnh được cung cấp dưới đây sẽ làm cho điều này rõ ràng và rõ ràng hơn
Python itertools groupby nhiều khóa
Thí dụ

Phổ biến bây giờ

Mọi thứ về Python SortedDict

Ví dụ thực tế về groupby

students = [
	{
		'name':'Teri Howard',
		'state':'CA'
	},
	{
		'name':'Stephen Reyes',
		'state':'CA'
	},
	{
		'name':'Thalia Franklin',
		'state':'CA'
	},
	{
		'name':'Yvonne Slater',
		'state':'Tx'
	},
	{
		'name':'Rolf Wilcher',
		'state':'Tx'
	},
	{
		'name':'Teri Dinwiddie',
		'state':'MS'
	},
	{
		'name':'Fred Greer',
		'state':'AL'
	},
	{
		'name':'Lane Snee',
		'state':'AL'
	}
]

def get_state(students):
    return students['state']
grouped_students = itertool.groupby(students, get_state)

for state, students in grouped_student:
    print(f"State: {state}")
    for student in students:
        print(f"Students: {student}", end=" ")
	print()

  • Giả sử, bạn được cung cấp một lượng lớn dữ liệu chi tiết về sinh viên ở định dạng dữ liệu từ điển/json. Nhiệm vụ của bạn là nhóm học sinh bằng cách sử dụng một số phím (trạng thái ở đây). Quan sát đầu ra bên dưới
Python itertools groupby nhiều khóa
Được nhóm bằng cách sử dụng trạng thái làm khóa

itertools. nhóm trên mảng 2-D

import itertools 

key_func = lambda x:x[0]
organims = [['land','lion'],['aquatic','shark'],['air','eagle'],['land','bear'],['land','monkey'],['aquatic','octopus']]

for key, group in itertools.groupby(sorted(organims,key=key_func),key_func):
	print('{}: {}'.format(key,[i[1] for i in group]))

Python itertools groupby nhiều khóa
Phương pháp nhóm trên mảng 2 chiều

Python itertools groupby nhiều khóa

xu hướng

[Đã sửa] ModuleNotFoundError. Không có mô-đun nào có tên Pycocotools

Câu hỏi thường gặp trên itertools. theo nhóm ()

Q1. itertools. groupby() không nhóm chính xác?

itertools. groupby() thu thập các mục liền kề với nhau bằng cùng một khóa. Nói cách khác, việc sắp xếp các lần lặp lại của bạn sẽ giúp bạn tránh khỏi bất kỳ sự khác biệt hoặc lỗi nào

quý 2. Nhóm của SQL so với nhóm của Python

Một sự khác biệt đáng kể giữa hai loại này là trong trường hợp nhóm của SQL, không cần sắp xếp dữ liệu. Tuy nhiên, trong phương pháp nhóm của Python, điều này là cần thiết để tránh lỗi và sai lệch

Q3. Lỗi. itertools. groupby() không có len()

Vì itertools groupby trả về một trình vòng lặp, nên đó là một luồng các bộ dữ liệu. Vì len() bị giới hạn trong các lần lặp, nên nói một cách đơn giản, nó sẽ không hoạt động. Thay vào đó, bạn có thể chuyển đổi nó thành một danh sách và tìm độ dài. Nhưng thay vì làm đầy bộ nhớ, bạn có thể bắt đầu một biến đếm, tăng nó bằng một vòng lặp và lấy độ dài