如何在迭代期间将一个列表中的值分组为多个嵌套列表?

时间:2018-05-16 03:08:50

标签: python loops iteration

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

假设我有以下列表:

mylist = ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7',
          'item8', 'item9', 'item10', 'item11', 'item12', 'item13', 'item14', 
          'item15', 'item16', 'item17', 'item18', 'item19', 'item12']

现在我想将此列表中的每四个项目分组到一个嵌套列表中,但嵌套列表的长度不能超过最大长度为四个。

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

(EDIT W / ANSWER):

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

1 个答案:

答案 0 :(得分:2)

使用列表理解。

<强>实施例

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