在Python中按长度拆分列表列表

在Python中按长度拆分列表列表,python,list,Python,List,考虑到以下问题,在Python中最有效(或合理有效)的方法是什么: 问题。给定列表 L = [list_0, list_1, list_2, list_3, ..., list_n] 其中len(list_i)一个老式的解决方案在这里可能更有效: cells0, cells1, cells2 = [], [], [] for lst in asc_sample: n = len(lst) if n == 1: cells0.append(lst) el

考虑到以下问题,在Python中最有效(或合理有效)的方法是什么:

问题。给定列表

L = [list_0, list_1, list_2, list_3, ..., list_n]

其中len(list_i)一个老式的解决方案在这里可能更有效:

cells0, cells1, cells2 = [], [], []

for lst in asc_sample:
    n = len(lst)
    if n == 1:
        cells0.append(lst)
    elif n == 2:
        cells1.append(lst)
    else:
        cells2.append(lst)

这绝对是最好的,因为它并行运行。不过,您还应该看看
itertools.groupby
和内置的
filter
方法

result = dict()

for lst in L:
    result.setdefault(len(lst), []).append(lst)

print result
输出

{
 1: [[0], [1], [2], [3]],
 2: [[0, 0], [0, 1], [0, 2]],
 3: [[0, 0, 0], [0, 0, 1], [0, 0, 2]]
}

索引列表/元组应该比查找键快。这比问题中给出的版本快约30%

cells = [],[],[],[]     # first list here isn't used, but it's handy for the second version
for i in asc:
    cells[len(i)].append(i)
通过提取append方法,速度会稍微快一点(在较大的列表上,这几乎是OP的两倍)


L_3
的意义是什么?你刚才说的
len(list_i)通过对列表进行排序,然后使用
itertools.groupby
@slider Sorry,你可能会获得显著的加速;我的意思是3分。这有点令人困惑,因为长度1列表代表“0-单元格”,长度1列表代表“1-单元格”,等等,所以我混淆了一堆。编辑以反映这一点!确切地一次迭代而不是三次。我使用
cells\u by\u length=collections.defaultdict(list)
将asc中子列表的内部循环代码缩短为
,示例:cells\u by\u length[len(sublist)]。append(sublist)
,但这是相同的想法。这比我的计算机上原来的运行速度慢!我认为这可能会因为“append”部分而变慢,但我错了——这比我的方法快一点。美好的在对一些随机生成的列表进行更多的测试之后,这似乎比原来的列表稍微好一点,或者稍微差一点。在很长很长的列表上追加可能会造成一些延迟吗?这很奇怪,因为我希望原版也会有同样的问题;我来试试这个。对于filter方法,2.7.x的文档说这相当于上面的列表理解,除非我想的不对。
filter
方法在python 3.x中创建了一个生成器,它比列表理解有许多优点。如果你想使用groupby,你需要像gnibbler指出的那样,首先按长度排序,我认为groupby首先需要一个排序列表。对它们进行排序似乎需要花费很多时间(至少在我的PC上,在Python2.7.x上)。也许有办法解决排序问题?查找计数排序这比其他排序慢一点,但不会太多!不过,我不知道setdefault,这很酷。对我来说,第一个在非常非常大的列表上运行得有点慢,但是第二个比原来的要快一点。第二个也很好,因为我不知道你能做这样的事情——或者,至少,我认为我以前没见过这样的事情。
cells = [],[],[],[]     # first list here isn't used, but it's handy for the second version
for i in asc:
    cells[len(i)].append(i)
cells = [],[],[],[]
appends = [x.append for x in cells]
for i in asc:
    appends[len(i)](i)