Làm thế nào để xây dựng một bộ trong danh sách các mục trong python?


170

Tôi có một listtên tập tin trong python và tôi muốn xây dựng một settrong số tất cả các tên tập tin.

filelist=[]
for filename in filelist:
    set(filename)

Điều này dường như không hoạt động. Làm thế nào có thể làm điều này?

Câu trả lời:


322

Nếu bạn có một danh sách các đối tượng có thể băm (tên tệp có thể là chuỗi, vì vậy chúng nên được tính):

lst = ['foo.py', 'bar.py', 'baz.py', 'qux.py', Ellipsis]

bạn có thể xây dựng bộ trực tiếp:

s = set(lst)

Trong thực tế, setsẽ làm việc theo cách này với bất kỳ đối tượng lặp lại! (Không phải vịt đang gõ tốt sao?)


Nếu bạn muốn làm điều đó lặp đi lặp lại:

s = set()
for item in iterable:
    s.add(item)

Nhưng hiếm khi cần phải làm theo cách này. Tôi chỉ đề cập đến nó bởi vì set.addphương pháp này khá hữu ích.


1
Tôi đang sử dụng 2.7 và điều này dường như không hoạt động. Những gì đang xảy ra ở đây? Python 2.7.13 (mặc định, ngày 24 tháng 7 năm 2017, 14:22:59) [GCC 4.2.1 Tương thích Apple LLVM 8.1.0 (clang-802.0.42)] trên darwin Loại "trợ giúp", "bản quyền", "tín dụng" hoặc "giấy phép" để biết thêm thông tin. >>> x = [1,2,3] >>> bộ (x) bộ ([1, 2, 3]) >>>
opus111

@ user1902291-- Có vẻ như nó đã hoạt động, bạn chỉ cần theo dõi bộ kết quả: y = set(x)
mgilson

Cũng lưu ý rằng việc thêm các mục trong bộ từ danh sách có thể chứng minh là rất hữu ích khi bạn muốn lọc các bản sao khỏi danh sách.
Pranjal Kumar

12

Giải pháp trực tiếp nhất là đây:

 s = set(filelist)

Vấn đề trong mã gốc của bạn là các giá trị không được gán cho tập hợp . Đây là phiên bản sửa lỗi của mã của bạn:

 s = set()
 for filename in filelist:
     s.add(filename)
 print(s)

9

Bạn có thể làm

my_set = set(my_list)

hoặc, đối với Python 3,

my_set = {*my_list}

để tạo một bộ từ danh sách. Ngược lại, bạn cũng có thể làm

my_list = list(my_set)

hoặc, đối với Python 3,

my_list = [*my_set]

để tạo một danh sách từ một bộ.

Chỉ cần lưu ý rằng thứ tự của các thành phần trong danh sách thường bị mất khi chuyển đổi danh sách thành tập hợp do tập hợp vốn không có thứ tự. (Tuy nhiên, một ngoại lệ trong CPython là nếu danh sách chỉ bao gồm các số nguyên không âm, nhưng tôi cho rằng đây là hậu quả của việc triển khai các bộ trong CPython và hành vi này có thể khác nhau giữa các lần triển khai Python khác nhau.)


4

Đây là một giải pháp khác:

>>>list1=["C:\\","D:\\","E:\\","C:\\"]
>>>set1=set(list1)
>>>set1
set(['E:\\', 'D:\\', 'C:\\'])

Trong mã này, tôi đã sử dụng phương thức set để biến nó thành một tập hợp và sau đó nó loại bỏ tất cả các giá trị trùng lặp khỏi danh sách


1

Một cách chung để xây dựng thiết lập theo cách lặp như thế này:

aset = {e for e in alist}

0

Đơn giản chỉ cần đặt dòng:

new_list = set(your_list)
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.