如何将列表划分为具有大致相同值的k个子列表?

时间:2014-04-11 04:01:23

标签: 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,2,2], [5,7,2,1]]     # it has response values 1,2,1

我脑海中唯一想到的就是以某种方式使用排序。但是,可能会有一些pythonic方式。因为,列表L可以很长,比如说10000,我希望有一种有效的方法。

2 个答案:

答案 0 :(得分:0)

你解释的方法确实是最pythonic /有效的方法之一。按响应值对列表进行排序,然后通过获取每个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]]

答案 1 :(得分:0)

我真的不明白OP想要什么但是我可以显示排序列表包含100,000个元素( 100,000个子列表)在慢速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