Python: Chuyển đổi danh sách thành từ điển với các chỉ mục dưới dạng giá trị


83

Tôi đang cố gắng chuyển đổi danh sách sau:

list = ['A','B','C']

Đối với một từ điển như:

dict = {'A':0, 'B':1, 'C':2}

Tôi đã thử câu trả lời từ các bài viết khác, không có câu trả lời nào phù hợp với tôi. Tôi có mã sau đây cho bây giờ:

{list[i]: i for i in range(len(list))}

Điều này mang lại cho tôi lỗi này:

unhashable type: 'list'

Bất kỳ sự giúp đỡ nào cũng được đánh giá cao. Cảm ơn.


mã của bạn làm việc cho tôi.
Daniel

3
1. Không sử dụng listlàm tên biến 2. Sử dụng enumeratenhư hình{j:i for i,j in enumerate(l)}
Bhargav Rao

1
Bạn có một lỗi trong mã mà bạn chưa cho chúng tôi xem. Các yếu tố của listcó lẽ là danh sách, mặc dù bạn có thể mắc các lỗi khác, như viết list: ithay vì list[i]: i.
user2357112 hỗ trợ Monica

@ user2357112 Tôi đã sửa bài. Bạn đúng là tạo ra rất nhiều khác biệt.
ahajib

Lạ mà không ai để ý gì nếu có những yếu tố trùng lặp
Exodia

Câu trả lời:


125

Bạn có thể lấy các chỉ số của danh sách từ bảng liệt kê tích hợp sẵn . Bạn chỉ cần đảo ngược bản đồ giá trị chỉ mục và sử dụng khả năng hiểu từ điển để tạo từ điển

>>> lst = ['A','B','C']
>>> {k: v for v, k in enumerate(lst)}
{'A': 0, 'C': 2, 'B': 1}

Ồ, và đừng bao giờ đặt tên biến thành một kiểu hoặc một kiểu cài sẵn.


16

Sử dụng các chức năng có sẵn dict và zip:

>>> lst = ['A','B','C']
>>> dict(zip(lst,range(len(lst))))

10

Phương thức dictkhởi tạo Python có khả năng chuyển đổi danh sách tuplethành dict, với khóa là phần tử đầu tiên của tuple và giá trị là phần tử thứ hai của tuple. Để đạt được điều này, bạn có thể sử dụng hàm nội trang enumeratemang lạituple của (index, value).

Tuy nhiên yêu cầu của câu hỏi là hoàn toàn ngược lại, tức là tuplephải (value, index). Vì vậy, điều này yêu cầu và bước bổ sung để đảo ngược các phần tử tuple trước khi chuyển đến hàm tạo dict. Đối với bước này, chúng ta có thể sử dụng nội trang reversedvà áp dụng nó cho từng phần tử của danh sách bằng cách sử dụngmap

>>> lst = ['A', 'B', 'C']
>>> dict(map(reversed, enumerate(lst)))
>>> {'A': 0, 'C': 2, 'B': 1}

Phiên bản này dường như mất nhiều thời gian hơn so với các giải pháp khác được cung cấp
Leland Hepworth

3

Không sử dụng listlàm tên biến của bạn vì nó được Python dành riêng. Bạn cũng có thể tận dụng enumerate.

your_list = ['A', 'B', 'C']
dict = {key: i for i, key in enumerate(your_list)}

1
tại sao bạn không sử dụng mục trong vòng lặp của bạn?
Daniel

Bởi vì bạn không cần phải làm vậy. Tôi vẫn thay đổi nó.
gr1zzly be4r

0

Bạn phải chuyển đổi danh sách không thể truy cập thành một bộ:

dct = {tuple(key): idx for idx, key in enumerate(lst)}
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.