从字符串创建python字典的最佳方法是什么?

2024-09-20 03:52:18 发布

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

我有一个大文件,我将在其中解析大约1.9E8行。你知道吗

在每次迭代过程中,我将创建一个临时字典发送给另一个方法,它将提供我想要的输出。你知道吗

由于文件太大,我无法用readlines()方法打开它。你知道吗

所以我最后的办法就是在解析过程中加快速度。你知道吗

我已经有两个生成字典的选项了。optionB的性能比optionA好,我知道我可以试试regex,不过我不太熟悉。如果有更好的选择,我愿意接受。你知道吗

预期输入:"A@1:100;2:240;...:.."输入可能更长,它可以有更多的组和它们的频率

def optionA(line):
    _id, info = line.split("@")
    data = {}
    for g_info in info.split(";"):
        k, v = g_info.split(":")
        data[k] = v
    return data

def optionB(line):
    _id, info = line.split("@")
    return dict(map(lambda i: i.split(":"), info.split(";")))

预期输出:{'1': '100', '2': '240'}

我愿意接受任何建议!你知道吗


Tags: 文件方法infoiddatareturn字典过程
2条回答

正则表达式解析行的快速示例:

>>> import re
>>> line = 'A@1:100;2:240'
>>> data = re.search(r'@(\d+):(\d+);(\d+):(\d+)',line).groups()
>>> D = {data[0]:data[1],data[2]:data[3]}
>>> D
{'1': '100', '2': '240'}

以下是一些时间安排:

import re
regex = re.compile(r'@(\d+):(\d+);(\d+):(\d+)')

def optionA(line):
    _id, info = line.split("@")
    data = {}
    for g_info in info.split(";"):
        k, v = g_info.split(":")
        data[k] = v
    return data

def optionB(line):
    _id, info = line.split("@")
    return dict(map(lambda i: i.split(":"), info.split(";")))

def optionC(line):
    data = regex.search(line).groups()
    return {data[0]:data[1],data[2]:data[3]}

line = 'A@1:100;2:240'

次数:

C:\>py -m timeit -s "import x" "x.optionA(x.line)"
100000 loops, best of 3: 3.01 usec per loop

C:\>py -m timeit -s "import x" "x.optionB(x.line)"
100000 loops, best of 3: 5.15 usec per loop

C:\>py -m timeit -s "import x" "x.optionC(x.line)"
100000 loops, best of 3: 2.88 usec per loop

编辑:随着需求的轻微变化,我尝试了findalloptionCoptionA的稍微不同的版本:

import re
regex = re.compile(r'(\d+):(\d+)')

def optionA(line):
    _id, info = line.split("@")
    data = {}
    for g_info in info.split(";"):
        k, v = g_info.split(":")
        data[k] = v
    return data

def optionAA(line):
    data = {}
    for g_info in line[2:].split(";"):
        k, v = g_info.split(":")
        data[k] = v
    return data

def optionB(line):
    _id, info = line.split("@")
    return dict(map(lambda i: i.split(":"), info.split(";")))

def optionC(line):
    return dict(regex.findall(line))

line = 'A@1:100;2:240;3:250;4:260;5:100;6:100;7:100;8:100;9:100;10:100'

时间安排:

C:\>py -m timeit -s "import x" "x.optionA(x.line)"
100000 loops, best of 3: 8.35 usec per loop

C:\>py -m timeit -s "import x" "x.optionAA(x.line)"
100000 loops, best of 3: 8.17 usec per loop

C:\>py -m timeit -s "import x" "x.optionB(x.line)"
100000 loops, best of 3: 12.3 usec per loop

C:\>py -m timeit -s "import x" "x.optionC(x.line)"
100000 loops, best of 3: 12.8 usec per loop

所以看起来修改后的optionAA在这一行中获胜。希望这能说明测量算法的重要性。我很惊讶findall的速度慢了。你知道吗

下面是一个使用编译的regexp来匹配您的模式的简单示例。你知道吗

import re

s = "A@1:100;2:240"
compiledre = re.compile("A@(\d+):(\d+);(\d+):(\d+)$")
res = compiledre.search(s)
if res:
    print dict([(res.group(1),res.group(2)),(res.group(3),res.group(4))])

输出为:

{'1': '100', '2': '240'}

相关问题 更多 >