Как мне переназначить ключи диктона Python - PullRequest
20 голосов
/ 13 марта 2009

Я работаю над программой, которая (помимо прочего) считывает файл CSV (он сохраняется как массив dicts в форме [{col1:data1a,col2:data2a},{col1:data1b,col2:data2b}]). Для каждой строки, как часть другой обработки, мне нужно переназначить эти ключи в значения, введенные пользователем, которые представлены в другом документе, чтобы их можно было использовать в качестве параметров в вызове API. Массив сопоставления имеет вид: {badname1:goodname1, badname2:goodname2,...}.

Так что я хотел бы получить от: {badname1:data1, badname2:data2,...} до {goodname1:data1, goodname2:data2,...}

Я бы хотел использовать что-то вроде zip() (хотя zip() дает {badname1:badname1,...}).

Похоже, должно быть очевидное решение, которое намекает на меня.

EDIT: Если данные в a и отображение в b:

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

Я подхожу близко, но это будет работать только в тех случаях, когда я думаю, что поля находятся в одном и том же порядке.

Ответы [ 3 ]

24 голосов
/ 13 марта 2009
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())
    ...

Или в Python2.7 + с Dict Conpretions :

for row in rows:
    row = {name_map[name]: val for name, val in row.items()}
4 голосов
/ 24 октября 2011

Если вы используете Python 2.7 или Python 3.x, вы можете использовать словарь . Это эквивалентный ответ elo80ka (который использовал понимание списка), но дает немного более читаемый код.

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()}
    ...
2 голосов
/ 13 марта 2009
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]

Это то, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...