鱼C论坛

 找回密码
 立即注册
查看: 1588|回复: 7

[已解决]将列表拆分成指定个数的列表

[复制链接]
发表于 2017-7-31 17:55:35 | 显示全部楼层 |阅读模式
5鱼币
RT:写一个函数foo(lis,n)传入2个参数,第一个是一个列表,第二个是需要拆分的个数
然后把指定的列表拆分成指定的个数(不需要每个列表的元素相同,毕竟这样也不一定能保证)
下面这个是我想的,但是感觉不简介
  1. def foo(lis,n):
  2.   if len(lis)%n == 0:
  3.     new = [lis[i*len(lis)//n:(i+1)*len(lis)//n] for i in range(n)]
  4.   else:
  5.     new = [lis[i*len(lis)//n:(i+1)*len(lis)//n] for i in range(n-1)]
  6.     new.append(lis[(n-1)*len(lis)//n:])
  7.   print(new)
  8.   return new
  9.   
  10. lis = list(range(23))
  11. foo(lis,3)
复制代码


输出结果:[[0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13, 14], [15, 16, 17, 18, 19, 20, 21, 22]]

有没有比较简介的?
lambda直接能搞定的那种?
最佳答案
2017-7-31 17:55:36
本帖最后由 小锟 于 2017-7-31 19:05 编辑

你可以看看numpy的split方法
https://docs.scipy.org/doc/numpy/reference/generated/numpy.split.html
另外一个array_split更符合
http://docs.scipy.org/doc/numpy/reference/generated/numpy.array_split.html

最佳答案

查看完整内容

你可以看看numpy的split方法 https://docs.scipy.org/doc/numpy/reference/generated/numpy.split.html 另外一个array_split更符合 http://docs.scipy.org/doc/numpy/reference/generated/numpy.array_split.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-31 17:55:36 | 显示全部楼层    本楼为最佳答案   
本帖最后由 小锟 于 2017-7-31 19:05 编辑

你可以看看numpy的split方法
https://docs.scipy.org/doc/numpy/reference/generated/numpy.split.html
另外一个array_split更符合
http://docs.scipy.org/doc/numpy/reference/generated/numpy.array_split.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-31 19:02:29 | 显示全部楼层
  1. >>> def ls_split(ls,n):
  2.         ln = len(ls)
  3.         m = ln % n
  4.         x = ln//n+(m>0)
  5.         ret = list(zip(*([iter(ls)]*x)))
  6.         if m>0 :ret.append(tuple(ls[ln//x*x:]))
  7.         return  ret

  8. >>> ls_split(range(21),3)
  9. [(0, 1, 2, 3, 4, 5, 6), (7, 8, 9, 10, 11, 12, 13), (14, 15, 16, 17, 18, 19, 20)]
  10. >>> ls_split(range(23),3)
  11. [(0, 1, 2, 3, 4, 5, 6, 7), (8, 9, 10, 11, 12, 13, 14, 15), (16, 17, 18, 19, 20, 21, 22)]
  12. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-31 19:08:50 | 显示全部楼层
  1. >>> from itertools import zip_longest as zipl
  2. >>> def ls_split(ls,n):
  3.         return [list(filter(None,x))for x in zipl(*([iter(ls)]*(len(ls)//n+(len(ls)%n>0))))]

  4. >>> ls_split(range(21),3)
  5. [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19, 20]]
  6. >>> ls_split(range(23),3)
  7. [[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22]]
  8. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-31 19:33:30 | 显示全部楼层
本帖最后由 Castieler 于 2017-8-4 11:50 编辑

简单的来了

                               
登录/注册后可看大图

def foo(lis,n):
   for i in range(n):
      if i==n-1:
         print( lis[i:])
      else:
         print( lis[i:i+1])
foo([1,2,3,4,45,65],3)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-31 20:11:18 | 显示全部楼层
我写了一个,如果要写为labbda则需把s的计算重复几次写到一句中。
  1. import math
  2. def f(lst, n):
  3.      s = math.ceil(len(lst) / n)
  4.      return [lst[s * i: s * i + s] for i in range(n)]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-8-1 19:24:38 | 显示全部楼层
Castieler 发表于 2017-7-31 19:33
简单的来了

def foo(lis,n):

打印不是目的,return才是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-4 11:49:35 | 显示全部楼层
gopythoner 发表于 2017-8-1 19:24
打印不是目的,return才是

def foo( lis, n):
        a=[]
        for i in range(n):               
                if i == n - 1:                       
                        a.append(lis[i:])
                else:
                        a.append(lis[i:i + 1])
        return a
print(foo( [1, 2, 3, 4, 45, 65], 3))
改一下就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 02:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表