我是Python的新手,我正在编写一个简单的程序
输入
{'messagingservice': 'build4',
'oltpdatabase': 'build1',
'paymentsdatabase': 'build2',
'restserver': 'build5',
'PESQL': 'build3',
'configdatabase': 'build1'}
预期产量如下
{'build4': 'messagingservice',
'build5': 'restserver',
'build2': 'paymentsdatabase',
'build3': 'PESQL',
'build1': 'oltpdatabase,configdatabase '}
以下是我用过的代码......
#!/usr/bin/python
import json
import ast
from sys import argv
data = json.dumps(argv[1]);
json_to_unicode = json.loads(data)
unicode_to_dic = ast.literal_eval(json_to_unicode);
print(unicode_to_dic);
result_dic={};
data='';
for k,v in unicode_to_dic.iteritems():
if v in result_dic:
data=data.join((result_dic[v],','));
print (data)
result_dic[v]=data
else:
result_dic[v]=k;
print(result_dic)
实际输出为:
{'build4': 'messagingservice',
'build5': 'restserver',
'build2': 'paymentsdatabase',
'build3': 'PESQL',
'build1': 'oltpdatabase,'}
缺少一个值。
答案 0 :(得分:4)
您可以使用defaultdict
,这可以使程序更容易:
unicode_to_dic = {
'messagingservice': 'build4',
'oltpdatabase': 'build1',
'paymentsdatabase': 'build2',
'restserver': 'build5',
'PESQL': 'build3',
'configdatabase': 'build1'}
from collections import defaultdict
res = defaultdict(list)
# find all keys that have the same value
for key, value in unicode_to_dic.items():
res[value].append(key)
# convert the list of keys to a string seperated by ','
for key, value in res.items():
res[key] = ','.join(value)
# Convert it to a normal dict - that's optional because defaultdict behaves just
# like a normal dict (in most circumstances at least).
dict(res)
# {'build1': 'oltpdatabase,configdatabase',
# 'build2': 'paymentsdatabase',
# 'build3': 'PESQL',
# 'build4': 'messagingservice',
# 'build5': 'restserver'}
我还没有调试过您的算法,但有几件事情很突出:
Python在行尾不需要;
。
str.join
实际上称为seperator.join(list_of_words_to_be_joined)
。您使用分隔符作为函数的输入。
答案 1 :(得分:1)
data.join
并没有按照您的想法行事。你想要的是:
result_dic[v] += ',' + k
答案 2 :(得分:1)
您的加入未加入新项目
result_dic={}
data=''
for k,v in d.iteritems():
if v in result_dic.keys():
data=data.join((result_dic[v],', ',k))
result_dic[v]=data
else:
result_dic[v]=k
print(result_dic)
返回
{'build4': 'messagingservice', 'build5': 'restserver', 'build2': 'paymentsdatabase', 'build3': 'PESQL', 'build1': 'oltpdatabase, configdatabase'}
你也可以使用collections.Counter
from collections import Counter
new =Counter()
d={'messagingservice': 'build4', 'oltpdatabase': 'build1', 'paymentsdatabase': 'build2', 'restserver': 'build5', 'PESQL': 'build3','configdatabase': 'build1'}
for k,v in d.items():
if new[v]:
new[v]+=', '+k
else:
new[v]=k
print new
返回
Counter({'build1': 'oltpdatabase, configdatabase',
'build2': 'paymentsdatabase',
'build3': 'PESQL',
'build4': 'messagingservice',
'build5': 'restserver'})