2011-02-01 26 views
7

tôi có chức năng sau:Make bản đồ() trả về một cuốn từ điển

def heading_positions(self): 
    return map(
      lambda h: 
       {'{t}.{c}'.format(t=h.table_name,c=h.column_name) : h.position }, 
       self.heading_set.all() 
      ) 

Nó mang lại cho tôi ra như thế này:

[{'customer.customer_number': 0L}, {'customer.name': 2L}, ... ] 

tôi muốn chỉ là một bộ từ điển như thế này:

{'customer.customer_number': 0L, 'customer.name': 2L, ... 

Có cách nào để làm cho map (hoặc một cái gì đó tương tự) chỉ trả lại một từ điển duy nhất thay vì một mảng từ điển Bạch Dương?

Trả lời

7

Tại sao sử dụng map() sau đó?

dict(
    ('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position) 
    for h in self.heading_set.all() 
    ) 

sẽ hoạt động.

+3

Hoặc định dạng '{'{t}. {C}'. (...): h.định vị cho h trong self.heading_set.all()}' trong các phiên bản gần đây hơn (những phiên bản có dict comprehensions). – delnan

+1

Đọc hiểu Dict xuất hiện trong 2.7/3.1. –

2
return dict(('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position) 
      for h in self.heading_set.all()) 
1

Khi câu trả lời khác hiển thị, bạn có thể sử dụng dict() hiểu.

Nhưng, như một sự tò mò có lẽ, bạn cũng có thể sử dụng reduce

EDIT: Khi bình luận nói, dict() là dễ dàng hơn trong trường hợp này. Nhưng, chỉ vì lý thuyết, những gì tôi có nghĩa là nó có thể giải quyết bằng các khối xây dựng chỉ có chức năng (không có comprehensions điển kỳ diệu của python):

def union(d1,d2): 
    result = {} 
    result.update(d1) 
    result.update(d2) 
    return result 

Sau đó:

reduce(union, sequence_of_dictionaries, {}) 

Ngoài ra, ít sạch nhưng hiệu quả hơn, sử dụng một phiên bản thay thế của dict.update trả về đối số đầu tiên của nó:

def update2(d1, d2): 
    dict.update(d1, d2) 
    return d1 

Hoặc thậm chí:

update2 = lambda d1,d2: (d1, d1.update(d2))[0] 

Sau đó:

reduce(update2, sequence_of_dictionaries, {}) 

ở đâu trong trường hợp này sequence_of_dictionaries sẽ là:

[{'{t}.{c}'.format(t=h.table_name, c=h.column_name) : h.position} 
for h in self.heading_set.all()] 
+0

...... Cái gì? – eumiro

+1

Đừng bận tâm, dict() với khả năng đọc danh sách là giải pháp nhanh hơn trong trường hợp này. Nhưng về mặt lý thuyết, bạn muốn có một lần công đoàn và một dict trống, đó là những gì tôi đang nhắm tới ... – sinelaw

+0

Nếu câu trả lời của bạn sai, hãy xóa nó hoặc sửa chữa nó. Nếu đúng, vui lòng bao gồm ví dụ về cách thực hiện điều đó. – agf

6

Có. Vấn đề cơ bản là bạn không tạo một từ điển ra khỏi một mục nhập dict s, nhưng trong một chuỗi các chuỗi có độ dài-hai là (key, value).

Vì vậy, chứ không phải là tạo ra một độc lập đơn nhập dict với chức năng, tạo ra một tuple và sau đó bạn có thể sử dụng dict() constructor:

dict(map(lambda h: ('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position), 
     self.heading_set.all())) 

Hoặc trực tiếp sử dụng một máy phát điện hoặc danh sách hiểu bên trong constructor dict :

dict(('{t}.{c}'.format(t=h.table_name, c=h.column_name), h.position) 
    for h in self.heading_set.all()) 

Hoặc, trên các phiên bản mới nhất (2.7, 3.1) trực tiếp hiểu từ điển:

{'{t}.{c}'.format(t=h.table_name : c=h.column_name), h.position) 
    for h in self.heading_set.all()} 
Các vấn đề liên quan