当前位置: 首页 > 面试题库 >

创建子列表

郝池暝
2023-03-14
问题内容

与列表变平相反。

给定一个列表和一个长度为n的列表,返回一个长度为n的子列表的列表。

def sublist(lst, n):
    sub=[] ; result=[]
    for i in lst:
        sub+=[i]
        if len(sub)==n: result+=[sub] ; sub=[]
    if sub: result+=[sub]
    return result

一个例子:

如果列表是:

[1,2,3,4,5,6,7,8]

n是:

3

返回:

[[1, 2, 3], [4, 5, 6], [7, 8]]

有没有一种更雄辩/简洁的方法

顺便说一句,将列表追加到列表时(在上面的上下文中)是首选:

list1+=[list2]

要么:

list1.append(list2)

鉴于(根据Summerfeild的“ Python 3编程”),它们是一样的吗?

谢谢。


问题答案:

这样的列表列表可以使用列表理解来构造:

In [17]: seq=[1,2,3,4,5,6,7,8]
In [18]: [seq[i:i+3] for i in range(0,len(seq),3)]
Out[18]: [[1, 2, 3], [4, 5, 6], [7, 8]]

还有石斑鱼成语:

In [19]: import itertools
In [20]: list(itertools.izip_longest(*[iter(seq)]*3))
Out[20]: [(1, 2, 3), (4, 5, 6), (7, 8, None)]

但请注意,缺少的元素会填充为值None。如果需要“无”以外的其他参数,则izip_longest也可以采用fillvalue参数。

list1+=[list2]-这次注意括号-
等价于list1.append(list2)。编写代码时,我最优先考虑的是可读性,而不是速度。因此,我会选择list1.append(list2)。但是,可读性是主观的,并且可能会受到您所熟悉的习惯用法的很大影响。

幸运的是,在这种情况下,可读性和速度似乎是一致的:

In [41]: %timeit list1=[1,2,3]; list1.append(list2)
1000000 loops, best of 3: 612 ns per loop

In [42]: %timeit list1=[1,2,3]; list1+=[list2]
1000000 loops, best of 3: 847 ns per loop


 类似资料:
  • 所以我有一个列表: 对于每个匹配的数字,我必须获取标识符的每个排列。我需要从我的示例中获得的列表如下: 我目前正在采取的解决问题的步骤: < li >读入列表,将每个值放入一个数组([a][12]),然后将它放入一个ArrayList中 < li >然后我会查找是否有重复的数字,并在散列表中记录下来 < li >然后我设置了一个for循环来遍历HashMap。如果号码没有重复,我就把它加到名单上。

  • 我有一个包含子对象列表的类,如下所示: 我有一个学生类列表,如下所示: 我可以使用传统的foreach循环对数据进行分组,但我想为此使用stream API,但不能这样做。你能帮忙吗?

  • 我们曾经轻松地通过控制台去使用 Posts.insert 来创建帖子并插入到数据库。但我们不可能指望用户去打开控制台来创建一个新的帖子吧? 所以我们需要在用户界面上创建一些表单控件,让用户在我们的 App 上发布一些新的帖子。 构建新帖子的提交页面 我们首先为新帖子的提交页面定义一个路由: Router.configure({ layoutTemplate: 'layout', loadi

  • 问题内容: 例如,我有以下列表: 并希望将其用“ |”分隔 所以结果看起来像: 我怎样才能做到这一点?我只在网上找到需要一定长度元素的子列表示例 问题答案:

  • 我现有的使用阻止队列的代码创建了一个阻止队列列表(如私有列表 任何帮助将不胜感激。

  • 在mobile app开发过程中,经常会出现共用的导航栏或者选项卡,每次打开页面都需要重新渲染,而且容易出现卡头卡尾的现象。并且此时若使用局部滚动,在android手机上会出现滚动不流畅的问题; mui现在提供两种解决方案: 第一种(官方推荐):在plus环境下,使用原生titleNView以及原生tabbar来替换页面的导航栏或者选项卡。在页面打开时,渲染已经完成,让你的应用更接近原生app。具