2017-06-13 230 views
3

我是新來的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

你能提供這段代碼應該做什麼的簡短解釋嗎? – idjaw

+0

[格式字符串ValueError ast.literal \ _eval()帶有字符串表示形式的可能的重複](https://stackoverflow.com/questions/14611352/malformed-string-valueerror-ast-literal-eval-with-string-代表性的) –

回答

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'}) 
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)。您使用分隔符作爲函數的輸入。

+0

非常感謝,我花了整整一天的時間來破解這個.. :) –

+0

@VetrivelkumarPandi沒問題。不要忘記[upvote](https://stackoverflow.com/help/privileges/vote-up)所有有用的答案和[接受](https://meta.stackexchange.com/questions/5234/how-does接受工作)是最有幫助的。 – MSeifert

1

data.join不符合您的想法。你想要的是:

result_dic[v] += ',' + k