有没有更有效的方式来做我现在正在做的事情?你知道吗
我有一组名为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)
运行;lines
和items
速度很快,但也分别在O(N)
和O(N^2)
运行(正确吗?)。最后一个for
在O(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 asitems
sublist elements and construct adict()
?
我的商店没有抱怨,因为它做了很多工作比想象中快得多,但作为设计师,我知道这是有缺陷的(虽然只是因为数据点并不总是一致的)。你知道吗
一种方法是使用更有效的方法初始化
dict
。另外,可以将头初始化为set
,然后检查填充的字典键集与填充缺少的字典键集之间的差异。你知道吗根据
%%timeit
测试,此方法在7.57µs内完成此循环,而上面提供的循环需要17µs才能执行。这段代码也是更pythonicimho,似乎更容易解释。你知道吗相关问题 更多 >
编程相关推荐