Làm cách nào tôi có thể tạo Tập hợp các bộ trong Python?


126

Tôi đang cố gắng tạo một bộ các bộ trong Python. Tôi không thể tìm ra cách để làm điều đó.

Bắt đầu với tập hợp trống xx:

xx = set([])
# Now we have some other set, for example
elements = set([2,3,4])
xx.add(elements)

nhưng tôi hiểu

TypeError: unhashable type: 'list'

hoặc là

TypeError: unhashable type: 'set'

Có thể có một bộ các bộ trong Python?

Tôi đang xử lý một bộ lớn các bộ và tôi muốn không phải xử lý các bộ trùng lặp (một bộ B của các bộ A1, A2, ...., An sẽ "hủy" hai bộ nếu Ai = Aj)

Câu trả lời:


120

Python phàn nàn vì các setđối tượng bên trong có thể thay đổi và do đó không thể băm được. Giải pháp là sử dụng frozensetcho các bộ bên trong, để chỉ ra rằng bạn không có ý định sửa đổi chúng.


59

Mọi người đã đề cập rằng bạn có thể làm điều này với froundredet () , vì vậy tôi sẽ chỉ thêm một mã làm thế nào để đạt được điều này:

Ví dụ: bạn muốn tạo một bộ các bộ từ danh sách danh sách sau đây:

t = [[], [1, 2], [5], [1, 2, 5], [1, 2, 3, 4], [1, 2, 3, 6]]

bạn có thể tạo tập hợp của mình theo cách sau:

t1 = set(frozenset(i) for i in t)

9
hoặc bạn có thể sử dụng bản đồ! set(map(frozenset, t))
Matt Dodge

18

Sử dụng frozensetbên trong.


9
Có lẽ bạn có thể đưa ra một vài gợi ý về các đối tượng có thể thay đổi / bất biến trong Python vì anh ta mới?
Seth Johnson

2
@Seth: Tôi có thể, nhưng khả năng biến đổi không phải là một yếu tố.
Ignacio Vazquez-Abrams

Cảm ơn rất nhiều! Chỉ cần đọc lại: tính đột biến bây giờ. Có vẻ như một bộ danh sách cũng có thể hoạt động nhưng dường như hàng chục người đã hoàn thành nó. Cảm ơn một lần nữa!
Matt

@Ignacio Tôi nghĩ rằng các thành viên trong bộ và khóa trong dicts phải có khả năng băm và do đó không thay đổi.
Seth Johnson

7
Khả năng băm và khả năng biến đổi không nhất thiết phải loại trừ lẫn nhau. Nó chỉ xảy ra khi hầu hết các loại Python cơ bản chia sẻ một mẫu.
Ignacio Vazquez-Abrams

3

Vì vậy, tôi đã có cùng một vấn đề chính xác. Tôi muốn tạo một cấu trúc dữ liệu hoạt động như một tập hợp các tập hợp. Vấn đề là các bộ phải chứa các đối tượng bất biến . Vì vậy, những gì bạn có thể làm chỉ đơn giản là làm cho nó như một bộ tuple. Điều đó làm việc tốt cho tôi!

A = set()
A.add( (2,3,4) )##adds the element
A.add( (2,3,4) )##does not add the same element
A.add( (2,3,5) )##adds the element, because it is different!

22
Trong bộ dữ liệu, thứ tự phần tử quan trọng. Như vậy A.add( (4,3,2)); A.add((2,4,3)); A.add((2,3,4))sẽ thêm ba yếu tố khác nhau, trong khi câu hỏi ban đầu là về "tập hợp các bộ", mà ngụ ý rằng (2,3,4), (4,3,2), (2,4,3)đều giống nhau.
Boris Gorelik

1

Kể từ năm 2020, tài liệu Python chính thức khuyên bạn nên sử dụng frozensetđể đại diện cho các bộ.


1
Ồ, điều này rất thú vị khi PEP 416 (chính tả đóng băng) đã không được thông qua và nó đã được đề xuất vào năm 2012.
NikoNyrh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.