2017-12-15 93 views
5

Bằng cách lặp qua danh sách python, tôi muốn tạo một danh sách từ điển, theo đó giá trị của mỗi từ điển cũng là một danh sách.Làm cách nào để tạo danh sách từ điển (có giá trị danh sách) từ danh sách?

Cấu trúc sẽ là:

[{key1: [val1, val2]}, {key2: [val3, val4]}, {key3: [val5, val6]}, ...] 

Tôi bắt đầu với một danh sách các số nguyên:

my_list = [3423, 77813, 12, 153, 1899] 

Đối với mỗi phần tử trong danh sách, điều này sẽ trở thành một chìa khóa từ điển. Sau đó tôi nối thêm hai mục vào giá trị của từ điển (đây là danh sách). (Hãy nói rằng hai mục luôn "chó" và "mèo")

Đây là những gì kết quả cuối cùng sẽ giống như thế:

[{3423:['dog', 'cat']}, {77813:['dog', 'cat']}, {12:['dog', 'cat']}, 
    {153:['dog', 'cat']}, {1899:['dog', 'cat']}] 

nỗ lực của tôi để làm điều này có nhiều vấn đề:

for i in my_list: 
    d = {} ## create a dictionary 'd' 
    d[i] = [].append('dog') ## or `d[i] = ['dog'].append('cat')` 
    my_list.append(d) ## here is a bug 
    my_list.remove(i) ## remove the item from the list 
  1. Tôi không thích điều đó, tôi phải đặt tên cho một từ điển trống và đặt tên cho chúng là một thứ giống nhau (ở đây, d). Sau đó, tôi muốn truy cập từng từ điển này bằng các phím --- Tôi không quan tâm đến tên của chúng.

  2. Tôi không biết cách thêm một cách hợp lý nhiều mục vào giá trị từ điển khi nó thực sự được coi là danh sách. Nếu tôi muốn thêm một số mặt hàng thì sao?

  3. Lỗi đang thêm từ điển vào danh sách gốc và sau đó xóa mục. Đương nhiên, điều này có thể được giải quyết với một danh sách mới:

    new_list = [] 
    for i in my_list: 
        d = {} 
        d[i] = [].append('dog') 
        new_list.append(d) 
        my_list.remove(i) 
    

nhưng điều này cảm thấy rất vụng về.

+1

Bạn có phải sử dụng cấu trúc này để đạt được mục tiêu của mình không? Một cách tiếp cận hướng đối tượng có thể làm giảm một số sự phức tạp, tùy thuộc vào những gì bạn đang cố gắng đạt được. Ít nhất bạn có thể xem ''defaultdict'' trong' 'collections''-module. Sau đó, bạn có thể làm '' list_dict = defaultdict (danh sách) '', để bạn biết rằng mỗi mục trong dict đã là một danh sách trống. –

Trả lời

6

Nếu bạn muốn một cái gì đó thực sự đơn giản, bạn có thể sử dụng danh sách hiểu:

data = ['dog', 'cat'] 

my_list = [3423, 77813, 12, 153, 1899] 

result = [{k:data} for k in my_list] 

print(result) 
# [{3423: ['dog', 'cat']}, {77813: ['dog', 'cat']}, {12: ['dog', 'cat']}, {153: ['dog', 'cat']}, {1899: ['dog', 'cat']}] 

Thêm vào đó, đây là một ví dụ của việc thêm/gỡ bỏ các giá trị với rất thuận tiện defaultdict:

from collections import defaultdict 

my_list = [3423, 77813, 12, 153, 1899] 

new_list = [] 
for number in my_list: 

    # create the defaultdict here 
    d = defaultdict(list) 

    # add some data 
    d[number] += ['dog', 'cat', 'kitten'] 

    # remove some data 
    d[number].remove('kitten') 

    # append dictionary 
    new_list.append(dict(d)) 

print(new_list) 

nào kết quả đầu ra:

[{3423: ['dog', 'cat']}, {77813: ['dog', 'cat']}, {12: ['dog', 'cat']}, {153: ['dog', 'cat']}, {1899: ['dog', 'cat']}] 

Sử dụng defaultdict ở đây là hữu ích, vì nó khởi tạo mỗi mục trong từ điển với một danh sách trống. Nếu bạn không muốn làm điều này, bạn có thể đạt được điều này với một từ điển thông thường, như được hiển thị trong câu hỏi của bạn, nhưng điều này đòi hỏi bạn phải tự khởi tạo các danh sách trống.

+0

Tại sao nó sẽ là 'd [number] + = ['chó', 'mèo', 'con mèo con']' thay vì 'd [số] = ['con chó', 'con mèo', 'con mèo con']'? – EB2127

2

Bạn có thể sử dụng một lớp con collections.defaultdict từ điển để làm cho quá trình xử lý rất đơn giản:

from collections import defaultdict 
from pprint import pprint 

my_list = [3423, 77813, 12, 153, 1899] 
d = defaultdict(list) 

for i in my_list: 
    d[i].append('dog') 
    d[i].append('cat') 

d = dict(d) # Convert d into a regular dictionary (optional). 
pprint(d) 

Output:

{12: ['dog', 'cat'], 
153: ['dog', 'cat'], 
1899: ['dog', 'cat'], 
3423: ['dog', 'cat'], 
77813: ['dog', 'cat']} 

Tất nhiên, nếu tất cả các bạn sẽ làm là thêm hai mặt hàng với nhau mục nhập, sẽ hiệu quả hơn một chút khi thực hiện cả hai trong một thao tác đơn lẻ như sau:

for i in my_list: 
    d[i].extend(['dog', 'cat']) 
2

Nếu bạn muốn sử dụng danh sách hiểu với các giá trị khác nhau cho mỗi phím.

keys = ['key1', 'key2', 'key3'] 
values = [['val11', 'val12'], ['val21', 'val22'], ['val31', 'val32']] 

# This is what you want (if I understood correctly) 
dlist = [{x:values[i]} for i,x in enumerate(keys)] 

print(dlist) 

# When you want to add more dictionary to the list 
dlist.append({'key4': ['val41', 'val42']}) 

print(dlist) 

Output:

[{'key1':['val11','val12']}, {'key2':['val21','val22']}, {'key3':['val31','val32']}] 
[{'key1':['val11','val12']}, {'key2':['val21','val22']}, {'key3':['val31','val32']}, {'key4':['val41', 'val42']}] 
2

Bạn không cần phải loại bỏ, Nếu không nhập khẩu bất kỳ mô-đun bên ngoài hoặc không làm cho nó quá phức tạp Bạn chỉ có thể làm theo mô hình này trong python tinh khiết:

data = ['dog', 'cat'] 

my_list = [3423, 77813, 12, 153, 1899] 

new_data={} 
for item in my_list: 
    for sub_item in data: 

     if item not in new_data: 
      new_data[item]=[sub_item] 
     else: 
      new_data[item].append(sub_item) 

print(new_data) 

đầu ra:

{153: ['dog', 'cat'], 1899: ['dog', 'cat'], 12: ['dog', 'cat'], 77813: ['dog', 'cat'], 3423: ['dog', 'cat']} 
Các vấn đề liên quan