如何从原始数据字符串生成字典

2024-09-30 14:17:32 发布

您现在位置:Python中文网/ 问答频道 /正文

实际上,我需要从一串数据中创建一个字典

给予:

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

d(data)将导致:

^{pr2}$

我当前的代码显示一条错误消息“base10…”

^{3}$

Tags: 数据代码消息data字典错误base10pr2
3条回答

您可以使用正则表达式和generator expression来完成此操作:

代码:

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

测试代码:

^{pr2}$

结果:

^{3}$

但是!正则表达式:

因此,对于那些关心使用正则表达式的人:

让我们将regex答案与第二投票率答案进行比较:

import re
END_NUMS_RE = re.compile(r'^(\D+)(\d+)$')
data = "electron1, gamma5, proton43, boson98"

def method1():
    return dict(END_NUMS_RE.match(x.strip()).groups()
                for x in data.split(','))

def method2():
    l = data.split(',')
    return {
        ''.join(
            [x for x in item if not x.isdigit()]):
            int(''.join([x for x in item if x.isdigit()])) for item in l
    }


from timeit import timeit
print(timeit(method1, number=10000))
print(timeit(method2, number=10000))

计时结果:

0.05789754982012146
0.10536237238963242

regex的回答速度是原来的两倍。在

有几种不同的方法可以做到这一点。如果您知道您的列表中都有以某些数字结尾的字符串形式的条目,并且您希望以<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')]处理的对象。虽然我个人更喜欢regexp的简单性。在

一种没有re的方法

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)

输出

^{pr2}$

相关问题 更多 >

    热门问题