2009-03-23 47 views

Trả lời

278
>>> d = { 'a': 1, 'b': 2, 'c': 3 } 
>>> d.items() 
[('a', 1), ('c', 3), ('b', 2)] 
>>> [(v, k) for k, v in d.iteritems()] 
[(1, 'a'), (3, 'c'), (2, 'b')] 

Nó không phải theo thứ tự bạn muốn, nhưng dicts không có bất kỳ thứ tự cụ thể nào. Sắp xếp nó hoặc tổ chức nó khi cần thiết.

Xem: items(), iteritems()


Trong Python 3.x, bạn sẽ không sử dụng iteritems (mà không còn tồn tại), nhưng thay vì sử dụng items, mà bây giờ trả về một "cái nhìn" vào các mục từ điển . Xem tài liệu What's New cho Python 3.0 và documentation on views mới.

+0

mục() trả về một dict_keys xem trong python3. Quấn cuộc gọi này với một diễn viên vào danh sách "list()". Xem câu trả lời của @ SilentGhost – Erich

2
[(k,v) for (k,v) in d.iteritems()] 

[(v,k) for (k,v) in d.iteritems()] 
+6

"[(k, v) cho (k, v) trong d.iteritems()]" là tương đương khủng khiếp với d.items() –

5

gì bạn muốn là dict 's items()iteritems() phương pháp. items trả về danh sách các bộ giá trị (khóa, giá trị). Vì các bộ dữ liệu không thay đổi nên chúng không thể đảo ngược được. Vì vậy, bạn phải lặp lại các mục và tạo các bộ dữ liệu mới để lấy các bộ đếm (giá trị, khóa) được đảo ngược. Để lặp lại, iteritems thích hợp hơn vì nó sử dụng trình tạo để tạo ra các bộ đệm (khóa, giá trị) thay vì phải giữ toàn bộ danh sách trong bộ nhớ.

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> a = { 'a': 1, 'b': 2, 'c': 3 } 
>>> a.items() 
[('a', 1), ('c', 3), ('b', 2)] 
>>> [(v,k) for (k,v) in a.iteritems()] 
[(1, 'a'), (3, 'c'), (2, 'b')] 
>>> 
14

Bạn có thể sử dụng tính năng đọc danh sách.

[(k,v) for k,v in a.iteritems()] 

sẽ giúp bạn có [ ('a', 1), ('b', 2), ('c', 3) ]

[(v,k) for k,v in a.iteritems()] 

ví dụ khác.

Read more about list comprehensions nếu bạn thích, nó rất thú vị những gì bạn có thể làm với họ.

2
 
>>> a={ 'a': 1, 'b': 2, 'c': 3 } 

>>> [(x,a[x]) for x in a.keys() ] 
[('a', 1), ('c', 3), ('b', 2)] 

>>> [(a[x],x) for x in a.keys() ] 
[(1, 'a'), (3, 'c'), (2, 'b')] 
30

vì không có ai khác đã làm, tôi sẽ thêm phiên bản py3k:

>>> d = { 'a': 1, 'b': 2, 'c': 3 } 
>>> list(d.items()) 
[('a', 1), ('c', 3), ('b', 2)] 
>>> [(v, k) for k, v in d.items()] 
[(1, 'a'), (3, 'c'), (2, 'b')] 
7

Tạo một danh sách các namedtuples

Nó thường có thể rất tiện dụng để sử dụng namedtuple.Ví dụ, bạn có một từ điển của 'tên' như phím và chấm điểm như giá trị như:

d = {'John':5, 'Alex':10, 'Richard': 7} 

Bạn có thể liệt kê các mặt hàng như các bộ, sắp xếp nếu bạn thích, và có được tên và số điểm, chúng ta hãy nói, cầu thủ có điểm số cao nhất (index = 0) rất Pythonically như thế này:

>>> player = best[0] 

>>> player.name 
     'Alex' 
>>> player.score 
     10 

làm thế nào để làm điều này:

danh sách theo thứ tự ngẫu nhiên hoặc giữ gìn trật tự của collections.OrderedDict:

import collections 
Player = collections.namedtuple('Player', 'name score') 
players = list(Player(*item) for item in d.items()) 

theo thứ tự, được sắp xếp theo giá trị ('điểm'):

import collections 
Player = collections.namedtuple('Player', 'score name') 

được sắp xếp với điểm số thấp nhất đầu tiên:

worst = sorted(Player(v,k) for (k,v) in d.items()) 

được sắp xếp với số điểm cao nhất đầu tiên:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True) 
3

By keys()values() phương pháp từ điển và zip.

zip sẽ trả về danh sách các bộ dữ liệu hoạt động như một từ điển đặt hàng.

Demo:

>>> d = { 'a': 1, 'b': 2, 'c': 3 } 
>>> zip(d.keys(), d.values()) 
[('a', 1), ('c', 3), ('b', 2)] 
>>> zip(d.values(), d.keys()) 
[(1, 'a'), (3, 'c'), (2, 'b')] 
+0

Điều này làm việc cho tôi thay thế cho 'collections.OrderedDict () 'hoạt động tốt hơn với nhiều phiên bản của lib Yêu cầu HTTP của Python. Mặc dù tôi không thích tên hàm 'zip' như hơi mơ hồ/quá tải. – MarkHu

+0

Lưu ý rằng 'zip'-ification không phải là quá trình truyền" sâu ", tức là nếu có con lồng nhau, chúng sẽ không bị ảnh hưởng. Bạn có thể phải cuộn đệ quy của riêng bạn. – MarkHu

2
d = {'John':5, 'Alex':10, 'Richard': 7} 
list = [] 
for i in d: 
    k = (i,d[i]) 
    list.append(k) 

print list 
+2

Mặc dù mã này có thể giúp giải quyết vấn đề, nó không giải thích _why_ và/hoặc _how_ nó trả lời câu hỏi. Việc cung cấp ngữ cảnh bổ sung này sẽ cải thiện đáng kể giá trị giáo dục lâu dài của nó. Vui lòng [sửa] câu trả lời của bạn để thêm giải thích, bao gồm những giới hạn và giả định được áp dụng. –

Các vấn đề liên quan