Python 如何有效地缩短一个非常大的列表?
我的代码面临一个效率问题,我试图将一个很长的列表折叠成一个更小、更可行的列表 我从sql中获取的数据如下所示:Python 如何有效地缩短一个非常大的列表?,python,algorithm,python-2.7,Python,Algorithm,Python 2.7,我的代码面临一个效率问题,我试图将一个很长的列表折叠成一个更小、更可行的列表 我从sql中获取的数据如下所示: [a、1、2、3、4、5、6….] [b、1、2、3、4、5、6….] [b、1、2、3、4、5、6….] [b、1、2、3、4、5、6….] [c、1、2、3、4、5、6……] [c、1、2、3、4、5、6……] 我把它变成: [a,b,c]> [a,1,2,…] [b,1,2,,[b,1,2,,[b,1,2,…] [c,1,2,…],[c,1,2,…] 下面是我正在运行的代码来
[a、1、2、3、4、5、6….]
[b、1、2、3、4、5、6….]
[b、1、2、3、4、5、6….]
[b、1、2、3、4、5、6….]
[c、1、2、3、4、5、6……]
[c、1、2、3、4、5、6……]
我把它变成:
[a,b,c]>
[a,1,2,…]
[b,1,2,,[b,1,2,,[b,1,2,…]
[c,1,2,…],[c,1,2,…]
下面是我正在运行的代码来生成这个
master = []
for x in range(0, len(unique_ids)):
master.append([])
z=0;
for y in range(0,len(mysql_return)):
if(unique_ids[x] == list(mysql_return[y])[0]):
master[x].append(list(mysql_return[y]))
问题是,当回复进入Ks的100年代时,这种情况实际上会呈指数级下降。有更好的方法吗 IIUC
from itertools import groupby
from operator import itemgetter
first = itemgetter(0)
items = [['a', 1, 2, 3, 4, 5, 6],
['b', 1, 2, 3, 4, 5, 6],
['b', 1, 2, 3, 4, 5, 6],
['b', 1, 2, 3, 4, 5, 6],
['c', 1, 2, 3, 4, 5, 6],
['c', 1, 2, 3, 4, 5, 6]]
for k,v in groupby(items, key=first):
print(list(v))
[['a', 1, 2, 3, 4, 5, 6]]
[['b', 1, 2, 3, 4, 5, 6], ['b', 1, 2, 3, 4, 5, 6], ['b', 1, 2, 3, 4, 5, 6]]
[['c', 1, 2, 3, 4, 5, 6], ['c', 1, 2, 3, 4, 5, 6]]
其中items
是您的列表列表
此外,您还可以将其存储在词典中
d = {}
for k,v in groupby(items, key=first):
d[k] = list(v)
{'a': [['a', 1, 2, 3, 4, 5, 6]],
'b': [['b', 1, 2, 3, 4, 5, 6],
['b', 1, 2, 3, 4, 5, 6],
['b', 1, 2, 3, 4, 5, 6]],
'c': [['c', 1, 2, 3, 4, 5, 6],
['c', 1, 2, 3, 4, 5, 6]]}
警告:数据必须预先排序才能以开头
sorted(items, key=first)
在您的原始代码中没有显示任何形式的指数级减速
append
是一个(摊销的)O(1)操作,只需要定期扩展底层数组。也就是说,我会做一些改变:
mysql\u返回[y]
,而不创建新列表。如果出于某种原因确实需要列表而不是原始元组,则无需创建两次列表x
的唯一原因是对unique_id
进行只读访问;直接迭代这些值即可。你不需要它来索引master
;您总是希望附加到master
的最后一个元素,您可以使用master[-1]
来引用该元素y
;您仅将其用于对mysql\u return
的只读访问事实上,整个内部循环可以用一个列表理解来代替,结果列表在事实之后附加到
master
master = []
for unique_id in unique_ids:
master.append([list(x) for x in mysql_return if x[0] == unique_id])
剩下的循环也可以被列表替换
master = [[list(x) for x in mysql_return if x[0] == unique_id] for unique_id in unique_ids]
您的输入是列表列表吗?我有两个循环输入,列表原始列表和唯一ID列表(列表的第一个元素,唯一排序…),输出是列表列表列表。您不应该将整个数据库导入列表(它加载在RAM中)。。。如果可能的话,试着使用生成器。你真的需要调用
list(mysql\u return[y])
而不是使用mysql\u return[y]
as-is,如果是这样的话,你真的不需要调用它两次。哦,我不是导入entiredb,只是做一些连接,一次提取一个小时的数据,但有时行数会失控。数据将被排序。我认为这里有些混乱。我正在尝试建立列表列表,它目前不存在。只有原始的存在。是的,我更新了答案,以显示项目看起来像什么你可以建立这样的列表[列表(v)代表k,v在groupby(items,key=first)]
这将建立你的列表。随着列表长度的增长,我将迭代越来越多的元素。它可以摆脱我的问题,不管列表是如何建立的,拥有一个大的列表都是一个问题。在构建它时,您没有迭代master
。
master = [[list(x) for x in mysql_return if x[0] == unique_id] for unique_id in unique_ids]