【问题标题】:Logic issue in Python codePython代码中的逻辑问题
【发布时间】:2017-11-15 03:45:45
【问题描述】:

我是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,'}

又少了一个值。

【问题讨论】:

标签: python string python-2.7 dictionary


【解决方案1】:

您可以使用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)。您使用分隔符作为函数的输入。

【讨论】:

  • 非常感谢,我花了一整天的时间来破解这个.. :)
  • @VetrivelkumarPandi 没问题。不要忘记upvote所有有用的答案和accept最有用的答案。
【解决方案2】:

你的加入没有加入新的项目

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

【讨论】:

    【解决方案3】:

    data.join 不会按照你的想法去做。你想要的是:

    result_dic[v] += ',' + k
    

    【讨论】:

      猜你喜欢
      • 2020-10-31
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多