Làm thế nào tôi có thể chuyển đổi một từ điển thành một danh sách các bộ dữ liệu?


218

Nếu tôi có một từ điển như:

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

Làm thế nào tôi có thể chuyển đổi nó để này?

[ ('a', 1), ('b', 2), ('c', 3) ]

Và làm thế nào tôi có thể chuyển đổi nó để này?

[ (1, 'a'), (2, 'b'), (3, 'c') ]

7
[tuple(reversed(x)) for x in d.items()]
garej

1
@garej: xĐã có sẵn tupletrong mã của bạn (đó là bản chất của itemsviệc tạo ra một lần lặp của tuples), sẽ đơn giản hơn / nhanh hơn để làm [x[::-1] for x in d.items()]; lát đảo ngược trực tiếp xây dựng một đảo ngược tuplekích thước phù hợp thay vì có hàm tuplexây dựng lặp lại (với tổng thể và thay đổi kích thước ở cuối) a tupletừ một reversedtrình vòng lặp.
ShadowRanger

@ShadowRanger, bạn nói đúng. Tôi chỉ muốn nói rõ rằng không phải lúc nào cũng cần k, vmẫu trong những trường hợp như vậy.
garej

Lưu ý: đã thêm compatibilitythẻ vì sự khác biệt py2.x // py3.x
dreftymac

Câu trả lời:


360
>>> 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 theo thứ tự bạn muốn, nhưng dicts không có bất kỳ thứ tự cụ thể nào. 1 Sắp xếp nó hoặc sắp xếp nó khi cần thiết.

Xem: mục () , iteritems ()


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

1: Bảo quản thứ tự chèn cho các dicts đã được thêm vào Python 3.7


7
các mặt hàng () trả về một khung nhìn dict_keys trong python3. Kết thúc cuộc gọi này với một danh sách "list ()". Xem trả lời của @ SilentGhost
Erich

54

vì không ai khác làm, tôi sẽ thêm các 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')]

18

Bạn có thể sử dụng danh sách hiểu.

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

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

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

ví dụ khác

Đọc thêm về hiểu danh sách nếu bạn thích, thật thú vị những gì bạn có thể làm với chúng.


10

Tạo một danh sách các tên được đặt tên

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

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

Bạn có thể liệt kê các mục dưới dạng bộ, sắp xếp nếu bạn thích, lấy tên và điểm số, giả sử người chơi có số điểm cao nhất (index = 0) rất giống Python:

>>> player = best[0]

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

Làm như thế nào:

liệt kê theo thứ tự ngẫu nhiên hoặc theo thứ tự các bộ sưu tập.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 thấp nhất trước:

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

được sắp xếp với số điểm cao nhất trước:

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

7

Những gì bạn muốn là dict's items()iteritems()phương pháp. itemstrả về một danh sách các bộ dữ liệu (khóa, giá trị). Vì các bộ dữ liệu là bất biến, chúng không thể đảo ngượ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 để có được các bộ dữ liệu đảo ngược (giá trị, khóa). Đối với phép lặp, iteritemstốt hơn là vì nó sử dụng một trình tạo để tạo ra các bộ dữ liệu (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')]
>>> 

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

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

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

5

Đây là những thay đổi đột phá từ Python 3.x và Python 2.x

Đối với Python3.x sử dụng

dictlist = []
for key, value in dict.items():
    temp = [key,value]
    dictlist.append(temp)

Đối với Python 2.7 sử dụng

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)

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

>>> [(x, a [x]) cho x trong a.keys ()]
[('A', 1), ('c', 3), ('b', 2)]

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

4

Bởi keys()values()phương pháp của từ điển và zip.

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

Bản giới thiệu:

>>> 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')]

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

Lưu ý rằng zip-ification không phải là một "đúc" sâu, tức là nếu có những đứa trẻ 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

3
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 đề, nhưng nó không giải thích được tại sao và / hoặc cách nó trả lời câu hỏi. Cung cấp bối 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 chỉnh sửa câu trả lời của bạn để thêm giải thích, bao gồm những hạn chế và giả định được áp dụng.
Toby Speight

2

Một đơn giản hơn sẽ là

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples

Cái thứ hai không đơn giản hơn nhưng ừ.

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.