首页 > 解决方案 > 如何在迭代期间将一个列表中的值分组为多个嵌套列表?

问题描述

我无法确定如何将列表中的每四个值分组,然后作为嵌套列表添加到另一个列表中。

假设我有以下列表:

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

如何在数据值可能发生变化的函数中实现这样的结果?在这个函数中,我在参数中指定最终结果中嵌套列表的数量可以通过可选值进行更改。然后我指定每个嵌套列表不能长于在第三个参数中传递的特定长度,该参数也是可选的。

论据:

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

标签: pythonloopsiteration

解决方案


使用列表理解。

前任:

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

推荐阅读