enumerate () cho từ điển trong python


82

Tôi biết chúng tôi sử dụng enumerateđể lặp lại danh sách nhưng tôi đã thử nó trong từ điển và nó không báo lỗi.

MÃ:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}

for i, j in enumerate(enumm):
    print(i, j)

ĐẦU RA:

0 0

1 1

2 2

3 4

4 5

5 6

6 7

Ai đó có thể giải thích đầu ra?


2
for i, j in enumerate(enumm) được ităng lên ở mỗi lần lặp và jbắt mục thông thường từ enumerateđối số hàm, trong trường hợp này là một từ điển. Lặp lại các phần về cơ bản là lặp lại các khóa của nó.
Divyanshu Srivastava

Câu trả lời:


110

Trên đầu trang của các câu trả lời đã được cung cấp, có một mẫu rất đẹp trong Python cho phép bạn liệt kê cả khóa và giá trị của từ điển.

Trường hợp bình thường bạn liệt kê các khóa của từ điển:

example_dict = {1:'a', 2:'b', 3:'c', 4:'d'}

for i, k in enumerate(example_dict):
    print(i, k)

Đầu ra nào:

0 1
1 2
2 3
3 4

Nhưng nếu bạn muốn liệt kê thông qua cả khóa và giá trị thì đây là cách:

for i, (k, v) in enumerate(example_dict.items()):
    print(i, k, v)

Đầu ra nào:

0 1 a
1 2 b
2 3 c
3 4 d

1
(+1) Bạn cũng có thể chỉ cần sử dụng dictionary.items()(không liệt kê) để lấy một đối tượng xem với các cặp khóa-giá trị dưới dạng danh sách các bộ giá trị.
Tiago Martins Peres 李大仁

62

Cột đầu tiên của đầu ra là chỉ mục của từng mục trong enummvà cột thứ hai là các khóa của nó. Nếu bạn muốn lặp lại từ điển của mình thì hãy sử dụng .items ():

for k, v in enumm.items():
    print(k, v)

Và đầu ra sẽ giống như sau:

0 1
1 2
2 3
4 4 
5 5
6 6
7 7

31

Tôi chỉ nghĩ rằng tôi sẽ thêm, nếu bạn muốn liệt kê trên chỉ mục, khóa và giá trị của từ điển, vòng lặp for của bạn sẽ giống như sau:

for index, (key, value) in enumerate(your_dict.items()):
    print(index, key, value)

3
Câu hỏi này có liên quan đến các vấn đề về cú pháp, và câu trả lời này cung cấp các giải pháp ngắn nhất của hai ngoặc nói thêm:idx, (k, v) in enumerate(d.items()):
Sean Pianka

Xin chào Sean, tôi không chắc liệu bạn có đồng ý với câu trả lời hay chỉ đơn giản nói rằng tên các biến ngắn hơn tạo ra câu trả lời tốt hơn?
Jordan Mackie

25
dict1={'a':1, 'b':'banana'}

Để liệt kê từ điển trong Python 2.x:

for k,v in dict1.iteritems():
        print k,v 

Trong Python 3.x sử dụng:

for k,v in dict1.items():
        print(k,v)
# a 1
# b banana

Cuối cùng, như những người khác đã chỉ ra, nếu bạn muốn một chỉ mục đang chạy, bạn cũng có thể có:

for i  in enumerate(dict1.items()):
   print(i)  

 # (0, ('a', 1))
 # (1, ('b', 'banana'))

Nhưng điều này đánh bại mục đích của từ điển (bản đồ, mảng kết hợp) , là một cấu trúc dữ liệu hiệu quả để tra cứu theo kiểu danh bạ điện thoại. Thứ tự từ điển có thể là ngẫu nhiên đối với việc triển khai và không nên dựa vào. Nếu bạn cần thứ tự, hãy sử dụng OrderedDict để thay thế.


2
Nó không cho phép tôi thực hiện chỉnh sửa 2 ký tự trên bài đăng này, nhưng OP đã gắn thẻ điều này là dành cho Python 3, vì vậy câu lệnh in cần phải có dấu ngoặc đơn xung quanh k, v.
wp-overwatch.com

@Ông. Tôi, ty, sẽ sửa chữa.
roadrunner66

19
Điều này cần lưu ý là chỉ có sẵn cho python2. dict.iteritems () đã được loại bỏ trong python3, xem thêm stackoverflow.com/questions/30418481/...
gyger

1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lkahtz

Ty. Đã cập nhật python3 và python2. Đã thêm nhận xét về liệt kê.
roadrunner66

5

Vì bạn đang sử dụng nên enumeratecủa bạn ithực sự là chỉ mục của khóa chứ không phải chính khóa.

Vì vậy, bạn đang 3ở cột đầu tiên của hàng 3 4mặc dù không có khóa 3.

enumerate lặp qua cấu trúc dữ liệu (có thể là danh sách hoặc từ điển) đồng thời cung cấp số lần lặp hiện tại.

Do đó, các cột ở đây là số lặp theo sau là khóa trong từ điển enum

Những người khác Giải pháp đã chỉ ra cách lặp lại cặp khóa và giá trị, vì vậy tôi sẽ không lặp lại điều tương tự trong của tôi.


4

enumerate()khi làm việc trên danh sách thực sự đưa ra chỉ số và giá trị của các mục bên trong danh sách. Ví dụ:

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i, j in enumerate(list):
    print(i, j)

cho

0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9

trong đó cột đầu tiên biểu thị chỉ số của mục và cột thứ 2 biểu thị chính các mục đó.

Trong từ điển

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, j in enumerate(enumm):
    print(i, j)

nó cung cấp đầu ra

0 0
1 1
2 2
3 4
4 5
5 6
6 7

trong đó cột đầu tiên cung cấp chỉ mục của các key:valuecặp và cột thứ hai biểu thị chỉ mục keyscủa từ điển enumm.

Vì vậy, nếu bạn muốn cột đầu tiên là cột keysvà cột thứ hai values, tốt hơn hãy thử dict.iteritems()(Python 2) hoặc dict.items()(Python 3)

for i, j in enumm.items():
    print(i, j)

đầu ra

0 1
1 2
2 3
4 4
5 5
6 6
7 7

Thì đấy


1
Điều này không đúng với từ điển. Mã của bạn sẽ lặp qua từ điển bằng cách sử dụng một chỉ mục (để lặp lại) nhưng không cung cấp các tổ hợp khóa-giá trị của từ điển. Sử dụng dict.items () thay thế.
Matthias

vâng, bạn cũng có thể tiếp tục với dict.items (). Cảm ơn vì sự đúng đắn của bạn.
Abhishek Roy

3

Điều đó chắc chắn phải có vẻ khó hiểu. Vì vậy, đây là những gì đang xảy ra. Giá trị đầu tiên của enumerate (trong trường hợp này là i) trả về giá trị chỉ mục tiếp theo bắt đầu từ 0 nên 0, 1, 2, 3, ... Nó sẽ luôn trả về những số này bất kể những gì có trong từ điển. Giá trị thứ hai của enumerate (trong trường hợp này là j) đang trả về các giá trị trong từ điển / enumm của bạn (chúng tôi gọi nó là từ điển trong Python). Những gì bạn thực sự muốn làm là những gì roadrunner66 đã phản hồi.


3
  1. Lặp lại một lệnh Python có nghĩa là lặp lại các khóa của nó giống hệt như với dict.keys()
  2. Thứ tự của các khóa được xác định bởi mã triển khai và bạn không thể mong đợi một số thứ tự cụ thể:

    Các khóa và giá trị được lặp lại theo một thứ tự tùy ý không ngẫu nhiên, thay đổi qua các lần triển khai Python và phụ thuộc vào lịch sử chèn và xóa của từ điển. Nếu các chế độ xem khóa, giá trị và mục được lặp lại mà không có sửa đổi can thiệp nào đối với từ điển, thứ tự của các mục sẽ tương ứng trực tiếp.

Đó là lý do tại sao bạn thấy các chỉ số từ 0 đến 7 trong cột đầu tiên. Chúng được sản xuất bởi enumeratevà luôn theo đúng thứ tự. Hơn nữa, bạn sẽ thấy các phím từ 0 đến 7 của dict trong cột thứ hai. Chúng không được sắp xếp.


3

Python3:

Một cách giải quyết:

enumm = {0: 1, 1: 2, 2: 3, 4: 4, 5: 5, 6: 6, 7: 7}
for i, k in enumerate(enumm):
    print("{}) d.key={}, d.value={}".format(i, k, enumm[k]))

Output:
0) enumm.key=0, enumm.value=1
1) enumm.key=1, enumm.value=2
2) enumm.key=2, enumm.value=3
3) enumm.key=4, enumm.value=4
4) enumm.key=5, enumm.value=5
5) enumm.key=6, enumm.value=6
6) enumm.key=7, enumm.value=7

Một ví dụ khác:

d = {1 : {'a': 1, 'b' : 2, 'c' : 3},
     2 : {'a': 10, 'b' : 20, 'c' : 30}
    }    
for i, k in enumerate(d):
        print("{}) key={}, value={}".format(i, k, d[k])

Output:    
    0) key=1, value={'a': 1, 'b': 2, 'c': 3}
    1) key=2, value={'a': 10, 'b': 20, 'c': 30}

1
d = {0: 'zero', '0': 'ZERO', 1: 'one', '1': 'ONE'}

print("List of enumerated d= ", list(enumerate(d.items())))

đầu ra:

List of enumerated d=  [(0, (0, 'zero')), (1, ('0', 'ZERO')), (2, (1, 'one')), (3, ('1', 'ONE'))]

0

Bạn có thể thấy hữu ích khi bao gồm chỉ mục bên trong khóa:

d = {'a': 1, 'b': 2}
d = {(i, k): v for i, (k, v) in enumerate(d.items())}

Đầu ra:

{(0, 'a'): True, (1, 'b'): False}
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.