Làm cách nào để chuyển đổi danh sách các bộ dữ liệu khóa-giá trị thành từ điển?


125

Tôi có một danh sách giống như:

[('A', 1), ('B', 2), ('C', 3)]

Tôi muốn biến nó thành một cuốn từ điển giống như:

{'A': 1, 'B': 2, 'C': 3}

Cách tốt nhất để đi về điều này là gì?

EDIT: Danh sách các bộ dữ liệu của tôi thực sự giống như:

[(A, 12937012397), (BERA, 2034927830), (CE, 2349057340)]

1
Những loại thực thể đó A, B(hoặc BERA) và C(hoặc CE) thực sự là gì? Cảm ơn
ăn

Tôi sẵn sàng đặt cược rằng các lỗi được tạo ra với các ví dụ hoạt động dưới đây có liên quan đến việc anh ta không có danh sách các bộ dữ liệu, nhưng một danh sách cực kỳ dài mà anh ta muốn tách thành 2 bộ.
gddc

Câu trả lời:


90

Điều này mang lại cho tôi lỗi tương tự như cố gắng tách danh sách và nén nó. ValueError: phần tử trình tự cập nhật từ điển # 0 có độ dài 1916; 2 là bắt buộc

ĐÓ là câu hỏi thực tế của bạn .

Câu trả lời là các yếu tố trong danh sách của bạn không phải là những gì bạn nghĩ. Nếu bạn nhập, myList[0]bạn sẽ thấy rằng phần tử đầu tiên trong danh sách của bạn không phải là hai phần, ví dụ ('A', 1), mà là phần lặp có độ dài 1916.

Khi bạn thực sự có một danh sách theo mẫu bạn đã nêu trong câu hỏi ban đầu ( myList = [('A',1),('B',2),...]), tất cả những gì bạn cần làm là dict(myList).


Cảm ơn, tôi không biết làm thế nào danh sách có được theo cách đó nhưng sau khi làm lại từ đầu, tôi đã có thể sửa nó.
Fred Wilson

1
@DJ_Stuffy_K: (giả sử bối cảnh không liên quan đến câu hỏi này) Nói chung, trừ khi nó không cần thiết hoặc làm chậm chương trình của bạn, việc tạo các chỉ mục hữu ích thành bất kỳ cấu trúc dữ liệu trừu tượng nào bạn đang xây dựng là hoàn toàn tốt. Khái niệm "thực hành tốt" hoàn toàn phụ thuộc vào ngữ cảnh; Bạn có cần thời gian tra cứu O (1) cho các phím không? Ngoài ra, bạn không thể "chuyển đổi danh sách sang từ điển" một cách tùy tiện; nó hoàn toàn phụ thuộc vào ngữ nghĩa. ví dụ: [(1,2), (1,3)]> {1:3}sẽ khóa các phím của bạn và mất thông tin! Một dict là mối quan hệ một-* với thời gian chèn / xóa O (1). Danh sách là một danh sách.
ninjagecko 20/03/18

162
>>> dict([('A', 1), ('B', 2), ('C', 3)])
{'A': 1, 'C': 3, 'B': 2}

5
Cũng nhận xét về một câu trả lời khác gợi ý tương tự: Điều này không bao gồm việc có các 'khóa' trùng lặp, ví dụ: l=[('A',1), ('B',2), ('C',3), ('A', 2)]sẽ dẫn đến kết quả có 'A': 1thể không phải là kết quả mong muốn.
tham gia

32

Bạn đã thử điều này?

>>> l=[('A',1), ('B',2), ('C',3)]
>>> d=dict(l)
>>> d
{'A': 1, 'C': 3, 'B': 2}

ValueError: phần tử trình tự cập nhật từ điển # 0 có độ dài 1916; 2 là bắt buộc
Fred Wilson

Đó là một đường cắt thẳng từ thiết bị đầu cuối của tôi, vì vậy nó sẽ hoạt động. Bạn có thể hiển thị chính xác những gì bạn đã làm để có được lỗi đó?
Vô dụng

@Fred, chắc bạn đã nhầm lẫn gì đó, câu trả lời này là ổn.
martineau

@FredWilson đó là lỗi bạn thường gặp khi thử một thứ gì đó nhưdict([string1, string2, string3, string4])
chacham15

2
Điều này không bao gồm việc có các "khóa" trùng lặp, ví dụ: l=[('A',1), ('B',2), ('C',3), ('A', 2)]sẽ dẫn đến việc có 'A': 1thể không phải là kết quả mong muốn.
tham gia

10

Đây là một cách để xử lý các "khóa" trùng lặp:

# An example
l = [('A', 1), ('B', 2), ('C', 3), ('A', 5), ('D', 0), ('D', 9)]

# A solution
d = dict()
[d [t [0]].append(t [1]) if t [0] in list(d.keys()) 
 else d.update({t [0]: [t [1]]}) for t in l]
d

OUTPUT: {'A': [1, 5], 'B': [2], 'C': [3], 'D': [0, 9]}

Tuyệt vời! Giúp tôi ra ngoài.
un Pairestgood

thật tuyệt!, đã giúp rất nhiều
Athar

2

Một cách khác để sử dụng hiểu từ điển,

>>> t = [('A', 1), ('B', 2), ('C', 3)]
>>> d = { i:j for i,j in t }
>>> d
{'A': 1, 'B': 2, 'C': 3}

2

Nếu Tuple không có sự lặp lại quan trọng, thì thật đơn giản.

tup = [("A",0),("B",3),("C",5)]
dic = dict(tup)
print(dic)

Nếu tuple có sự lặp lại quan trọng.

tup = [("A",0),("B",3),("C",5),("A",9),("B",4)]
dic = {}
for i, j in tup:
    dic.setdefault(i,[]).append(j)
print(dic)

1
l=[['A', 1], ['B', 2], ['C', 3]]
d={}
for i,j in l:
d.setdefault(i,j)
print(d)
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.