减少时间复杂性的列表元素Dict()

2024-04-25 05:53:03 发布

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

有没有更有效的方式来做我现在正在做的事情?你知道吗

我有一组名为headers的列表值,将用于csv列标题。这些值与我正在分析的文件中的数据点的名称对齐。你知道吗

例如:

headers = ['date', 'timeup', 'timedown', 'angle', 'flag']

一个文件有20*分隔的记录组,因此我将每个分隔分析为组:

>>> groups[0]:
['date=170821    timeup=3\ntimedown=5    angle=30\nflag=Y']
>>> groups[1]
['date=170821    timeup=13\ntimedown=25    angle=36\n']

我进一步分析得到元素对,这样:

for group in groups:
    lines = [line for line in group.split('\n') if line and '=' in line]
    items = [item.strip().split('=') for line in lines
             for item in line.split('  ') if item]

获得:

>>>items[0]
[['date', 170821], ['timeup', 3], ['timedown', 5], ['angle', 30], ['flag', 'Y']]
>>>items[1]
[['date', 170821], ['timeup', 13], ['timedown', 25], ['angle', 6]]

现在要从中构建一个字典,并在缺少元素时填写'NULL',我将执行以下操作:

for group in groups:
    d = {}
    lines = [line for line in group.split('\n') if line and '=' in line]
    items = [item.strip().split('=') for line in lines
             for item in line.split('  ') if item]
    for header in headers:
        try:
            x = [header in item for item in items].index(True)
            d[header] = items[x][1]
        except:
            d[header] = 'NULL'

实际上,这样做非常耗时,有时我可以拥有一个拥有超过800K个组的groups对象,因此最前面的for已经在O(N)运行;linesitems速度很快,但也分别在O(N)O(N^2)运行(正确吗?)。最后一个forO(N)运行。你知道吗

总的来说,我有O(N) * O(N) * O(N^2) * O(N) = O(N^5),这太可怕了!你知道吗

问题:

Is there a better way to determine if all the headers elements exist as items sublist elements and construct a dict()?

我的商店没有抱怨,因为它做了很多工作比想象中快得多,但作为设计师,我知道这是有缺陷的(虽然只是因为数据点并不总是一致的)。你知道吗


Tags: infordateiflinegroupitemsitem
1条回答
网友
1楼 · 发布于 2024-04-25 05:53:03

一种方法是使用更有效的方法初始化dict。另外,可以将头初始化为set,然后检查填充的字典键集与填充缺少的字典键集之间的差异。你知道吗

headers_set = set(headers)

for group in groups:
    d = dict([x.split('=') for x in line.split() if '=' in line])
    for missing_key in headers_set - set(d.keys()):
        d[missing_key] = 'NULL'

根据%%timeit测试,此方法在7.57µs内完成此循环,而上面提供的循环需要17µs才能执行。这段代码也是更pythonicimho,似乎更容易解释。你知道吗

相关问题 更多 >