Python 如何有效地缩短一个非常大的列表?

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,…] 下面是我正在运行的代码来

我的代码面临一个效率问题,我试图将一个很长的列表折叠成一个更小、更可行的列表

我从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,…]
下面是我正在运行的代码来生成这个

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]