Как перегруппировать ключи python dict
Я работаю над программой, которая (среди прочего) читает CSV файл (он хранится в виде массива dicts в форме [{col1:data1a,col2:data2a},{col1:data1b,col2:data2b}]
). Для каждой строки, как части другой обработки, мне нужно переназначить эти ключи на введенные пользователем значения, которые предоставляются в другом dict, чтобы их можно было использовать в качестве параметров в вызове 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()))
Я приближаюсь, но он будет работать только в тех случаях, когда известно, что поля находятся в том же порядке, что и я.
Ответы
Ответ 1
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 Comprehensions:
for row in rows:
row = {name_map[name]: val for name, val in row.items()}
Ответ 2
Если вы используете 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()}
...
Ответ 3
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]
Это то, что вы после?