如何从原始数据字符串制作字典

时间:2019-01-12 01:27:05

标签: python

基本上,我需要根据一串数据创建一个字典

给出:

data = "electron1, gamma5, proton43, boson98, ..."

d(data)将导致:

{'electron':1, 'gamma':5, 'proton':43, 'boson':98, ...}

我当前的代码显示错误消息“ base 10 ...”

def d(n):
        pair = dict()
        for i in range(0,n):
                word = input().split()
                key = word[0]
                value = word[1]
                pair[key]=value
        print(pair)

n = int(input())          
d ={}                     
for i in range(n):        
    text = input().split()
    d[text[0]] = text[1]
print(d)

3 个答案:

答案 0 :(得分:8)

您可以使用正则表达式和类似generator expression的代码来做到这一点:

代码:

fetch(url).then().catch

测试代码:

try/catch

结果:

private static void Main()
{
    foreach (Process item in Process.GetProcesses())
    {
        try
        {
            Console.WriteLine($"{item.ProcessName} started at: {item.StartTime}");
        }
        catch(Exception e)
        {
            WriteColoredLine($"{e.Message}: {item.ProcessName}", ConsoleColor.Red);
        }
    }

    GetKeyFromUser("Done! Press any key to exit...");
}

private static void WriteColoredLine(string message, ConsoleColor color)
{
    Console.ForegroundColor = color;
    Console.WriteLine(message);
    Console.ResetColor();
}

但是!正则表达式:

对于那些担心使用正则表达式的人来说:

让我们以正则表达式的答案为基准,然后将投票结果排在第二位:

END_NUMS_RE = re.compile(r'^(\D+)(\d+)$')
dict(END_NUMS_RE.match(x.strip()).groups() for x in data.split(','))

计时结果:

import re
END_NUMS_RE = re.compile(r'^(\D+)(\d+)$')
data = "electron1, gamma5, proton43, boson98"
print(dict(END_NUMS_RE.match(x.strip()).groups() for x in data.split(',')))

正则表达式的答案是两倍。

答案 1 :(得分:5)

一种无需再做的方法

Data = "electron1, gamma5, proton43, boson98"
l=Data.split(',')
d={''.join([x for x in item if not x.isdigit()]):int(''.join([x for x in item if x.isdigit()])) for item in l}
print(d)

输出

{'electron': 1, ' gamma': 5, ' proton': 43, ' boson': 98}

答案 2 :(得分:2)

您可以通过两种不同的方法来执行此操作。如果您知道列表中的所有条目都以以某些数字结尾的字符串形式出现,并且您想以<non_numerical_string>: <integer>的形式将其分为键和值,那么这是一种在没有代码的情况下进行构建的方法使用正则表达式:

def d(original_string):
    data_dict = {}

    for item in original_string.split(', '):
        for t in enumerate(item):
            if t[1].isdigit():
                split_pos = t[0]
                break
        data_dict[item[:split_pos]] = int(item[split_pos:])

    return data_dict

data = "electron1, gamma5, proton43, boson98"
print(d(data))

在您的原始示例中,n = int(input())接受用户输入,并尝试将其全部转换为整数。稍后,当您在字符串上使用.split()时,会用空格将其分开,但这意味着逗号是新列表中各个字符串的一部分。因此,传递“ (", ")”会为您提供所需的分割(尽管这意味着原始字符串必须用逗号和空格分隔所有内容!)。

enumerate(item)部分采用类似于boson98的字符串,并返回可以像列表[(0, 'b'), (1, 'o'), (2, 's'), (3, 'o'), (4, 'n'), (5, '3'), (6, '8')]那样对待的对象。虽然我个人更喜欢正则表达式的简单性。