python:在dict上循环,每个键有多个值

python:在dict上循环,每个键有多个值,python,dictionary,Python,Dictionary,我有以下意见: {'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_gru,loc_virtual_vie', 'Name': 'aixbuildhost'} 如图所示,LocationId_Name键有两个值,用逗号分隔。我要做的是,在LocationId_Name键上循环并创建两个对应的 口述我可以移交给api调用的代码。 输出应该是这样的 {'NodeId_Name': 'lvgwatchit01t', 'LocationId

我有以下意见:

{'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无法在一次调用中处理这两个值。

使用values.split',在您迭代它之前,这将把它变成一个列表。

真的很接近

这一行:

for value in values:
…当值是字符串时,它将在字符串中的字符上迭代,这就是您获得输出的原因

如果您要将其更改为:

for value in values.split(','):
…你会得到你想要的


在这里,我们只调用values字符串上的方法,在您的例子中,其结果将迭代一个2元素列表。

使用简单的迭代和dict

例:

还是一艘班轮

输出:


假设您使用的是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'}]

下面是一个详细的分步解决方案:

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'}]

如果您使用的是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)
输出:

代码

结果

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

正如jedwards的回答所建议的那样——您需要在split中指定,否则它不会在逗号上拆分。值得解释的是,当执行{**d,k:v}时,d中的所有键:值对都被放入结果**d中,然后“LocationId_Name”被拆分的k:v中的单个元素覆盖。因此,不需要像我在回答中那样从d中弹出'LocationId_Name'元素。
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'}]
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'}]
{'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)
{'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_gru', 'Name': 'aixbuildhost'}
{'NodeId_Name': 'lvgwatchit01t', 'LocationId_Name': 'loc_virtual_vie', 'Name': 'aixbuildhost'}