我获得的大型csv有一张大型飞行数据表。我编写的帮助解析它的函数遍历Flight ID的列,然后按照首次出现的顺序返回包含每个唯一Flight ID的索引和值的字典。
Dictionary = {Index:FID,...}
这是对旧功能的快速调整,不需要担心列中的FID重复(几十行后......)。
现在,我让它迭代并按顺序比较每个值。如果某个值等于它之后的值,则会跳过该值。如果下一个值不同,则将值存储在字典中。我把它改为现在也检查之前是否已经发生过该值,如果是,则跳过它 这是我的代码:
def DiscoverEarliestIndex(self, number):
finaldata = {}
columnvalues = self.column(number)
columnenum = {}
for a, b in enumerate(columnvalues):
columnenum[a] = b
i = 0
while i < (len(columnvalues) - 1):
next = columnenum[i+1]
if columnvalues[i] == next:
i += 1
else:
if next in finaldata.values():
i += 1
continue
else:
finaldata[i+1]= next
i += 1
else:
return finaldata
效率非常低,随着字典的增长而变慢。这个专栏有520万行,所以使用Python处理这个问题显然不是一个好主意,但我现在仍然坚持使用它。
有没有更有效的方法来编写这个函数?
答案 0 :(得分:1)
您实际上在寻找数据库。数据库完全适用于大型数据集上的此类操作。使用CSV module一次解析整个CSV并将其发送到数据库中比将它们存储在dict中并对整个dict运行检查要快得多。
*large* python dictionary with persistence storage for quick look-ups
答案 1 :(得分:1)
要直接回答您的问题,您应该可以使用dict comprehensions和itertools模块执行此操作。
>>> import itertools as it
>>> data = {1: 'a', 2: 'a', 3: 'c', 4: 'c', 5:'d' }
>>> grouped_shit = {k: list(v) for (k,v) in it.groupby(data.iteritems(), lambda (_,v): v)}
>>> good_shit = {v[0][0]: k for (k, v) in grouped_shit.iteritems()}
>>> good_shit
{1: 'a', 3: 'c', 5: 'd'}
我认为这可以稍微调整一下 - 我不会非常高兴两次翻阅dict。但无论如何,我认为dict理解非常有效。此外,groupby
假设您的密钥是有序的 - 也就是说,它假设所有'a'索引都组合在一起,这在您的情况下似乎是正确的。
答案 2 :(得分:1)
if next in thegoodshit.values():
可能是你的问题,你在这里做的是
也许您可以使用set
来保存值并搜索 - 就像这样:
while i < (len(columnvalues) - 1):
next = columnenum[i+1]
if columnvalues[i] == next:
i += 1
else:
if next in searchable_data:
i += 1
continue
else:
finaldata[i+1]= next
searchable_data.add(next)
i += 1
else:
return finaldata