【问题标题】:How to divide list into k sublists with approximately same values?如何将列表划分为具有大致相同值的 k 个子列表?
【发布时间】:2014-05-25 01:21:46
【问题描述】:

我想将一个列表分成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,因此我希望有一种有效的方法。

【问题讨论】:

  • 你使用的排序算法有什么问题?也许给我们看看。
  • @thefourtheye k 是我必须通过划分列表 L 形成的子列表的数量。
  • @Codingman 子列表的长度应该大致相同吗?您对“大约相等”有什么容忍度?到目前为止你写了什么?
  • @jonrsharpe 假设,L 的长度 = 13,那么对于 k=3,每个新创建的子列表将有 length/3 个元素,除了最后一个子列表将有 length/3 + length%3 个元素
  • @Codingman 并且您的示例输出与示例输入的顺序相同这一事实只是巧合吗?如果是这样,那不是一个很好的例子。

标签: python list python-2.7 sublist


【解决方案1】:

您解释的方法确实是最 Pythonic/最有效的方法之一。按响应值对列表进行排序,然后通过获取每个k'th 元素将排序后的列表拆分为子列表:

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]]

【讨论】:

    【解决方案2】:

    我不太了解 OP 想要什么,但我可以显示在慢速 Atom 机器上对具有 100,000 个元素( 100,000 个子列表)的列表进行排序只需 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 2022-01-04
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多