我想将列表划分为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,我希望有一种有效的方法。
答案 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