python - 如何在迭代期间将一个列表中的值分组为多个嵌套列表?
问题描述
我无法确定如何将列表中的每四个值分组,然后作为嵌套列表添加到另一个列表中。
假设我有以下列表:
mylist = ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7',
'item8', 'item9', 'item10', 'item11', 'item12', 'item13', 'item14',
'item15', 'item16', 'item17', 'item18', 'item19', 'item12']
现在我想将此列表中的每四个项目分组为一个嵌套列表,但嵌套列表不能超过最大长度四。
IE
mylist = [['item1', 'item2', 'item3', 'item4'], ['item5', 'item6', 'item7',
'item8'], ['item9', 'item10', 'item11', 'item12'], ['item13', 'item14',
'item15', 'item16'], ['item17', 'item18', 'item19', 'item12']]
如何在数据值可能发生变化的函数中实现这样的结果?在这个函数中,我在参数中指定最终结果中嵌套列表的数量可以通过可选值进行更改。然后我指定每个嵌套列表不能长于在第三个参数中传递的特定长度,该参数也是可选的。
论据:
- values = 函数将更改为嵌套组的数据。
- num_of_lists = 结果列表中允许的最大嵌套列表数。
- max_list_num = 嵌套列表中允许的最大值数。
mylist
传入参数时如何实现上述结果values
?以下是我当前的代码。
def group_items(values, num_of_lists=5, max_list_num=4):
grouped_lists = [[] for _ in xrange(num_of_lists)]
counter = 0
myvals = []
for v in values:
myvals.append(v)
try:
for item in grouped_lists:
if len(item) < max_list_num:
mygroup = myvals[0:max_list_num]
if mygroup not in grouped_lists:
grouped_lists[counter].extend(mygroup)
counter += 1
except IndexError: pass
return grouped_lists
print group_items(mylist, num_of_lists=5, max_list_num=4)
上面的代码返回给我这个而不是期望的结果:
>>> [['item1', 'item2', 'item3', 'item4'], [], [], [], []]
(编辑/答案):
感谢 Rakesh 的快速回答。由于这个函数只是我的整个程序的一个示例,它将使用数据执行其他任务,我需要将代码保留在里面。我稍微修改了他的代码并将其添加到我的函数中(尽管我推荐他的确切方法,因为它的代码行数更少):
def group_items(values, num_of_lists=5, max_list_num=4):
grouped_lists = [[] for _ in xrange(num_of_lists)]
counter = 0
myvals = []
for v in values:
myvals.append(v)
try:
for item in range(0, len(myvals), max_list_num):
nested_vals = myvals[item:item+max_list_num]
grouped_lists[counter].extend(nested_vals)
counter += 1
except IndexError: pass
return grouped_lists
解决方案
使用列表理解。
前任:
mylist = ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7',
'item8', 'item9', 'item10', 'item11', 'item12', 'item13', 'item14',
'item15', 'item16', 'item17', 'item18', 'item19', 'item12']
max_list_num = 4
print([mylist[i:i+max_list_num] for i in range(0, len(mylist), max_list_num)])
输出:
[['item1', 'item2', 'item3', 'item4'], ['item5', 'item6', 'item7', 'item8'], ['item9', 'item10', 'item11', 'item12'], ['item13', 'item14', 'item15', 'item16'], ['item17', 'item18', 'item19', 'item12']]
推荐阅读
- c - 如何强制 gnu ld 使用 -lc 中的符号覆盖我自己的 libc 副本中的符号?
- java - 来自 TextField 的 SimpleIntegerProperty
- javascript - 为脚本添加仅在 Travis CI 中运行而不是在本地运行的权限
- matlab - 无法实例化派生的 MATLAB 类而不会出错
- node.js - Firebase Web Init 错误文件已存在
- javascript - JS - D3 多线时间序列图
- git - 每次提交都会在 git 中创建一个新的树对象吗?
- keras - 在 Keras 中使用 ModelCheckpoint 时的最大递归深度错误
- javascript - 输入大小小于引导程序 4 中的“form-control-sm”,例如 xs?
- python - Python:PDF:如何读取复选框等表单元素