2016-08-29 27 views
7

Tôi đang cố gắng tạo từ điển từ các giá trị trong từ điển name_num, trong đó độ dài của danh sách là khóa mới và khóa và giá trị từ khóa name_num. Vì vậy:Cách thêm nhiều giá trị vào khóa trong từ điển Python

name_num = {"Bill": [1,2,3,4], "Bob":[3,4,2], "Mary": [5, 1], "Jim":[6,17,4], "Kim": [21,54,35]} 

Tôi muốn tạo ra các từ điển sau:

new_dict = {4:{"Bill": [1,2,3,4]}, 3:{"Bob":[3,4,2], "Jim":[6,17,4], "Kim": [21,54,35]}, 2:{"Mary": [5, 1]}} 

Tôi đã thử nhiều biến thể, nhưng mã này được tôi gần nhất:

for mykey in name_num: 
    new_dict[len(name_num[mykey])] = {mykey: name_num[mykey]} 

Output:

new_dict = {4:{"Bill": [1,2,3,4]}, 3:{"Jim":[6,17,4]}, 2:{"Mary": [5, 1]}} 

Tôi biết tôi cần phải lặp lại ough mã bằng cách nào đó để tôi có thể thêm các giá trị khác để chìa khóa 3.

Trả lời

5

Dictionary, mảng kết hợp hoặc bản đồ (nhiều tên, về cơ bản cùng chức năng) tài sản là các phím là duy nhất.

Các phím bạn muốn có, là số nguyên, không phải là duy nhất nếu độ dài giống nhau, đó là lý do mã của bạn không hoạt động. Đặt giá trị mới cho khóa hiện tại có nghĩa là thay thế giá trị cũ.

Bạn phải thêm cặp khóa-giá trị vào từ điển có giá trị hiện tại.

for mykey in name_num: 
    length = len(name_num[mykey]) 
    if length in new_dict: # key already present in new dictionary 
     new_dict[length][mykey] = name_num[mykey] 
    else: 
     new_dict[length] = {mykey: name_num[mykey]} 

nên làm các trick

+1

Cảm ơn Jezor. Tôi mới dùng Python. Điều đó làm sáng tỏ rất nhiều nhầm lẫn về cách thêm dữ liệu vào một từ điển. – Oedipus

22

Đây là một trường hợp sử dụng tốt cho defaultdict:

from collections import defaultdict 
name_num = { 
    'Bill': [1, 2, 3, 4], 
    'Bob': [3, 4, 2], 
    'Mary': [5, 1], 
    'Jim': [6, 17, 4], 
    'Kim': [21, 54, 35], 
} 

new_dict = defaultdict(dict) 
for name, nums in name_num.items(): 
    new_dict[len(nums)][name] = nums 

print(dict(new_dict)) 

Output:

{ 
    2: {'Mary': [5, 1]}, 
    3: {'Bob': [3, 4, 2], 'Jim': [6, 17, 4], 'Kim': [21, 54, 35]}, 
    4: {'Bill': [1, 2, 3, 4]} 
} 
+0

Karin, được thực hiện tốt. Tôi mới vào mặc định. Tôi cho rằng khi bạn tạo một từ điển mặc định, nó chỉ là vấn đề điền dữ liệu vào. – Oedipus

+0

Có - một dict mặc định về cơ bản cho phép bạn đặt giá trị mặc định cho một khóa từ điển nếu bạn cố gắng truy cập khóa và nó chưa tồn tại. Nó có ích một chút :) – Karin

+0

Tôi không mong đợi 'defaultdict' để giữ giá trị chỉ vì nó đã được truy cập – Bergi

4

Chỉ cần một sự thay thế cho người khác; bạn có thể sắp xếp theo chiều dài và sử dụng itertools.groupby:

>>> result = {} 
>>> f = lambda t: len(t[1]) 
>>> for length, groups in itertools.groupby(sorted(name_num.items(), key=f), key=f): 
...  result[length] = dict((k, v) for k, v in groups) 
>>> print result 
{ 
    2: {'Mary': [5, 1]}, 
    3: {'Bob': [3, 4, 2], 'Jim': [6, 17, 4], 'Kim': [21, 54, 35]}, 
    4: {'Bill': [1, 2, 3, 4]} 
} 

Trong một kịch bản trường hợp xấu nhất nơi mỗi danh sách bên trong có chiều dài khác nhau, điều này thực hiện O(n^2) đó là khá kém hiệu quả so với các giải pháp khác được đăng trên.

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