2009-03-13 25 views
15

Tôi đang làm việc trên một chương trình (trong số những thứ khác) đọc một tệp CSV trong (nó được lưu trữ dưới dạng một mảng các chữ cái ở dạng [{col1:data1a,col2:data2a},{col1:data1b,col2:data2b}]). Đối với mỗi hàng, như một phần của quá trình xử lý khác, tôi cần phải remap các khóa đó cho các giá trị do người dùng nhập vào, được cung cấp trong một lệnh khác để chúng có thể được sử dụng làm tham số trong lệnh gọi API. Mảng ánh xạ có dạng: {badname1:goodname1, badname2:goodname2,...}.Làm cách nào để tái ánh xạ các phím dict python

Vì vậy, tôi muốn nhận được từ: {badname1:data1, badname2:data2,...} để {goodname1:data1, goodname2:data2,...}

Tôi muốn sử dụng cái gì đó như zip() (mặc dù sản lượng zip(){badname1:badname1,...}).

Dường như có một giải pháp rõ ràng đang ám chỉ tôi.

EDIT: Nếu dữ liệu là trong a và lập bản đồ trong b:

dict(zip(b,a.itervalues()))

tôi nhận được gần, nhưng nó sẽ chỉ làm việc trong trường hợp các lĩnh vực được biết là theo thứ tự Tôi nghĩ.

Trả lời

20
name_map = {'oldcol1': 'newcol1', 'oldcol2': 'newcol2', 'oldcol3': 'newcol3'...} 

for row in rows: 
    # Each row is a dict of the form: {'oldcol1': '...', 'oldcol2': '...'} 
    row = dict((name_map[name], val) for name, val in row.iteritems()) 
    ... 

Hoặc trong Python2.7 + với Dict Comprehensions:

for row in rows: 
    row = {name_map[name]: val for name, val in row.items()} 
+2

Đúng. Cũng hoạt động mà không có [], như là một biểu thức máy phát điện. –

2
rows = [{"col1":"data1a","col2":"data2a"},{"col1":"data1b","col2":"data2b"}] 
name_map = {"col1":"newcol1","col2":"newcol2"} 

new_rows = [dict(zip(map(lambda x: name_map[x], r.keys()), r.values())) for r in rows] 

Đây có phải là những gì bạn đang sau?

4

Nếu bạn đang sử dụng Python 2.7 hoặc Python 3.x, bạn có thể sử dụng dictionary comprehension. Đây là câu trả lời tương đương của elo80ka (sử dụng một danh sách hiểu), nhưng tạo ra mã dễ đọc hơn một chút.

name_map = {'oldcol1': 'newcol1', 'oldcol2': 'newcol2', 'oldcol3': 'newcol3'...} 

for row in rows: 
    # Each row is a dict of the form: {'oldcol1': '...', 'oldcol2': '...'} 
    row = {name_map[name]: val for name, val in row.iteritems()} 
    ... 
Các vấn đề liên quan