python: зацикливание на dict с несколькими значениями на ключ - PullRequest
0 голосов
/ 02 июля 2018

У меня есть следующий дикт:

{'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_gru,loc_virtual_vie', 'Name': 'aixbuildhost'}

как видно, ключ «LocationId_Name» имеет два значения, разделенных запятыми. что я хочу сделать, это зациклить ключ «LocationId_Name» и создать два соответствующих диктует, что я могу передать вызов API. вывод должен быть таким.

{'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_gru', 'Name': 'aixbuildhost'}
{'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_virtual_vie', 'Name': 'aixbuildhost'}

Я попробовал следующее, но это просто выводит мусор ...

d_list = []
keys = ['Name', 'LocationId_Name', 'NodeId_Name']
add_data = {x:data_container[x] for x in keys}
print(add_data)
for key, values in add_data.iteritems():
    for value in values:
        d_list.append([key, value])
print(d_list)

[['NodeId_Name', 'l'], ['NodeId_Name', 'v'], ['NodeId_Name', 'g'], ['NodeId_Name', 'w'], ['NodeId_Name', 'a'], ['NodeId_Name', 't'], ['NodeId_Name', 'c'], ['NodeId_Name', 'h'], ['NodeId_Name', 'i'], ['NodeId_Name', 't'], ['NodeId_Name', '0'], ['NodeId_Name', '1'], ['NodeId_Name', 't'], ['LocationId_Name', 'l'], ['LocationId_Name', 'o'], ['LocationId_Name', 'c'], ['LocationId_Name', '_'], ['LocationId_Name', 'g'], ['LocationId_Name', 'r'], ['LocationId_Name', 'u'], ['LocationId_Name', ','], ['LocationId_Name', 'l'], ['LocationId_Name', 'o'], ['LocationId_Name', 'c'], ['LocationId_Name', '_'], ['LocationId_Name', 'v'], ['LocationId_Name', 'i'], ['LocationId_Name', 'r'], ['LocationId_Name', 't'], ['LocationId_Name', 'u'], ['LocationId_Name', 'a'], ['LocationId_Name', 'l'], ['LocationId_Name', '_'], ['LocationId_Name', 'v'], ['LocationId_Name', 'i'], ['LocationId_Name', 'e'], ['Name', 'a'], ['Name', 'i'], ['Name', 'x'], ['Name', 'b'], ['Name', 'u'], ['Name', 'i'], ['Name', 'l'], ['Name', 'd'], ['Name', 'h'], ['Name', 'o'], ['Name', 's'], ['Name', 't']]

фон в том, что этот тупой API не может обработать два значения в одном вызове.

Ответы [ 7 ]

0 голосов
/ 02 июля 2018

Если вы используете Python 3.5 или выше

d = {'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_gru,loc_virtual_vie', 'Name': 'aixbuildhost'}
d2 = [{**d, k:sv} for k,v in d.items() for sv in v.split(',') if ',' in v]
pprint(d2)

выход

[{'LocationId_Name': 'loc_gru',
  'Name': 'aixbuildhost',
  'NodeId_Name': 'lvgwatchit01t'},
 {'LocationId_Name': 'loc_virtual_vie',
  'Name': 'aixbuildhost',
  'NodeId_Name': 'lvgwatchit01t'}]
0 голосов
/ 02 июля 2018
{'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_gru,loc_virtual_vie', 'Name': 'aixbuildhost'}

код

for i in range(len(a["LocationId_Name"].split(","))):
    b = a.copy()
    b["LocationId_Name"] = b["LocationId_Name"].split(",")[i]
    print(b)

resutls

{'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_gru', 'Name': 'aixbuildhost'}
{'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_virtual_vie', 'Name': 'aixbuildhost'}
0 голосов
/ 02 июля 2018

Подробное пошаговое решение:

my_dict = {'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_gru,loc_virtual_vie', 'Name': 'aixbuildhost'}
# pop removes the item from the dict, split separates the string on the commas
locations = my_dict.pop('LocationId_Name').split(',')
print(locations)
# ['loc_gru', 'loc_virtual_vie']
output_dicts = []
for loc in locations:
    new_dict = {'LocationId_Name': loc}
    new_dict.update(my_dict)
    output_dicts.append(new_dict)
print(output_dicts)
# [{'LocationId_Name': 'loc_gru', 'NodeId_Name': 'lvgwatchit01t', 'Name': 'aixbuildhost'}, {'LocationId_Name': 'loc_virtual_vie', 'NodeId_Name': 'lvgwatchit01t', 'Name': 'aixbuildhost'}]
0 голосов
/ 02 июля 2018

Если вы используете Python3.5 или новее:

In [1]: d = {'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_gru,loc_virtual_vie', 'Name': 'aixbuildhost'}
In [2]: k = 'LocationId_Name'
In [3]: vals = d[k].split(',')
In [4]: 
In [5]: dicts = [{**d, k:v} for v in vals]
In [6]: dicts
Out[6]: 
[{'LocationId_Name': 'loc_gru',
  'Name': 'aixbuildhost',
  'NodeId_Name': 'lvgwatchit01t'},
 {'LocationId_Name': 'loc_virtual_vie',
  'Name': 'aixbuildhost',
  'NodeId_Name': 'lvgwatchit01t'}]
0 голосов
/ 02 июля 2018

Используя простую итерацию и dict

Ex:

d = {'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_gru,loc_virtual_vie', 'Name': 'aixbuildhost'}
res = []
for i in d["LocationId_Name"].split(","):
    newVal = dict((j, i) if j == "LocationId_Name" else (j, d[j]) for j in d.keys()) 
    res.append(newVal)
print(res)

Или однострочник

print( [dict((j, i) if j == "LocationId_Name" else (j, d[j]) for j in d.keys()) for i in d["LocationId_Name"].split(",")] )

Выход:

[{'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_gru', 'Name': 'aixbuildhost'}, {'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_virtual_vie', 'Name': 'aixbuildhost'}]
0 голосов
/ 02 июля 2018

Действительно близко!

Эта строка:

for value in values:

... когда values является строкой (то есть), будет перебирать символов в строке, поэтому вы получаете вывод, который вы делаете.

Если бы вы изменили это на что-то вроде:

for value in values.split(','):

... вы получите то, что ищете.

Здесь мы просто вызываем метод .split() для строки values, , результаты которого (в вашем случае, список из 2 элементов) будут повторяться более.

0 голосов
/ 02 июля 2018

Используйте values.split(','), прежде чем итерировать по нему, это превратит его в список.

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