Python 如何将列表划分为具有近似相同值的k个子列表?

Python 如何将列表划分为具有近似相同值的k个子列表?,python,list,python-2.7,sublist,Python,List,Python 2.7,Sublist,我想把一个列表分成k个子列表,每个子列表的响应值大致相同 我有以下表格的列表: L = [[1,2,3,2], [4,5,2,2], [2,3,9,1], [5,7,2,1], [2,3,3,1]] 响应值是每个子列表的最后一个元素。这里,响应值的范围为[1,2] 如果k=2,则响应大致相等的两个子列表为A和B: A = [[1,2,3,2], [2,3,3,1] # it has response values 1,2 B = [[2,3,9,1], [4,5

我想把一个列表分成k个子列表,每个子列表的响应值大致相同

我有以下表格的列表:

L = [[1,2,3,2], [4,5,2,2], [2,3,9,1], [5,7,2,1], [2,3,3,1]]
响应值是每个子列表的最后一个元素。这里,响应值的范围为[1,2]

如果k=2,则响应大致相等的两个子列表为A和B:

A = [[1,2,3,2], [2,3,3,1]                 # it has response values 1,2
B = [[2,3,9,1], [4,5,2,2], [5,7,2,1]]     # it has response values 1,2,1

我唯一想到的就是如何使用排序。但是,可能有一些类似于蟒蛇的方法。因为列表L可能很长,比如10000,我希望有一个有效的方法来完成它。

你解释的方法确实是最具python/效率的方法之一。根据响应值对列表进行排序,然后通过获取每个第k个元素将排序后的列表拆分为子列表:

def divideintokapprox(mylist, k):
    sortedlist = sorted(mylist, key=lambda x: -x[-1])
    return [sortedlist[i::k] for i in range(k)]
示例用法:

L = [[1,2,3,2], [4,5,2,2], [2,3,9,1], [5,7,2,1], [2,3,3,1]]

sublists = divideintokapprox(L, 2)
print(sublists[0])
#[[1, 2, 3, 2], [2, 3, 9, 1], [2, 3, 3, 1]]
print(sublists[1])
#[[4, 5, 2, 2], [5, 7, 2, 1]]

我真的不明白OP想要什么,但我可以展示排序一个包含100000个元素的列表,即100000个子列表在慢速Atom机器上只需要230毫秒。我希望OP认为它足够有效

>>> x = [ [ random.randrange(100) for _ in xrange(random.randrange(1, 1000)) ] for _ in xrange(10**5) ]

>>> import time
>>> a=time.time(); x.sort(key=lambda sl: sl[-1]); b=time.time()
>>> 1e3*(b-a)
226.77206993103027

$ python -V
Python 2.7.8
$ head -10 /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 28
model name      : Intel(R) Atom(TM) CPU D510   @ 1.66GHz
stepping        : 10
microcode       : 0x107
cpu MHz         : 1662.623
cache size      : 512 KB
physical id     : 0

您使用的排序算法有什么问题?也许可以给我们看看。@fourtheye k是我必须通过除以列表L来形成的子列表的数量。@Codingman子列表的长度应该大致相同吗?你们对近似相等的物体有什么公差?到目前为止你写了什么?@jornsharpe假设L的长度为13,那么对于k=3,每个新创建的子列表将有长度/3个元素,除了最后一个子列表的长度/3+长度%3个元素之外elements@Codingman您的示例输出与示例输入的顺序相同,这只是巧合吗?如果是这样,那就不是一个很好的例子。