将Python中的列表转换为嵌套列表

42

可能重复:
如何在Python中将列表转换为数组?

我如何将一个列表转换成数组,例如:

data_list = [0,1,2,3,4,5,6,7,8]

转换成一个列表的列表,如:

new_list = [ [0,1,2] , [3,4,5] , [6,7,8] ]

我想对有序列表中的元素进行分组,并将它们保留在一个有序列表中。我该如何实现?


4
你已经不到一个小时之前就问过了。 - user2665694
1
@Sentinel:不是严格的重复,因为它不涉及 numpy。但或许足够接近了。谢谢。 - eat
4
这并不是引用问题的重复。 listnumpy.array 的解决方案完全不同。 - pillmuncher
4
@Sentinel:你说得对,它们很相似,但现在我需要使用列表而不是数组。当我使用从先前问题中的np.reshape方法将其恢复为1D数组时,我失去了所有内部分组 - 我的数据不仅仅是[1,2,3 ...],而是很多个三元组。我需要一种方法将组织方式重新放回到三个元素,而不使用数组。因此,我认为这个问题本身就具有实用价值,并且与先前的问题显著不同。 - Double AA
1
据我所知,您实际上拥有一个形状为(48,365,3)的numpy数组,并且您已经发现将其视图重塑为形状(17520,3)将使您能够以直接的方式执行一些(形状保持)计算。现在,反向重塑将非常自然。无论如何,正如我建议的那样,请提出一个新问题,并提供详细描述(您的问题)。这些评论可能是这些描述的良好起点,但仅仅是一个起点。谢谢。 - eat
显示剩余5条评论
9个回答

90

这将按照它们出现的顺序将每3个元素分组:

new_list = [data_list[i:i+3] for i in range(0, len(data_list), 3)]

如果这不是你想要的,请给我们一个更好的示例。


我遇到了与上述问题类似的情况,你的代码完美地解决了我的问题!我在最后一阶段一直苦苦挣扎,很高兴终于能够解决它。 - Todd

23

这假设 data_list 的长度是三的倍数。

i=0
new_list=[]
while i<len(data_list):
  new_list.append(data_list[i:i+3])
  i+=3

8

类似这样:

map (lambda x: data_list[3*x:(x+1)*3], range (3))

5

根据Fred Foo的回答,如果您已经在使用numpy,则可以使用reshape来获取一个二维数组而不复制数据:

import numpy
new_list = numpy.array(data_list).reshape(-1, 3)

我喜欢这个,但它只在数组元素数量是3的倍数时才有效,否则会抛出ValueError异常。 - Nils Mackay

4

new_list = [data_list[x:x+3] for x in range(0, len(data_list) - 2, 3)]

使用列表推导式赢得胜利 :)


注:该代码用于将一个列表按照每三个元素分组。

1
以下函数将原始上下文扩展为包括任何所需的列表结构:
def gen_list_of_lists(original_list, new_structure):
    assert len(original_list) == sum(new_structure), \
    "The number of elements in the original list and desired structure don't match"
        
    list_of_lists = [[original_list[i + sum(new_structure[:j])] for i in range(new_structure[j])] \
                     for j in range(len(new_structure))]
        
    return list_of_lists

使用上述内容:
data_list = [0,1,2,3,4,5,6,7,8]
    
new_list = gen_list_of_lists(original_list=data_list, new_structure=[3,3,3])
# The original desired outcome of [[0,1,2], [3,4,5], [6,7,8]]

new_list = gen_list_of_lists(original_list=data_list, new_structure=[2,3,3,1])
# [[0, 1], [2, 3, 4], [5, 6, 7], [8]]

0

这里是一个通用解决方案

import math

data_list = [0,1,2,3,4,5,6,7,8]
batch_size=3

n_batches=math.ceil(len(data_list)/batch_size)

[data_list[x*batch_size:min(x*batch_size+batch_size,len(data_list))] 
    for x in range(n_batches)]

即使最后一个子列表的大小与其它子列表不相同(小于批处理大小<batch_size),代码仍然可以正常运行。


0

下面这个更加优化,而且非常直接。

data_list = [0,1,2,3,4,5,6,7,8]
result =[]
i=0
while i <(len(data_list)-2):
    result.append(data_list[i:i+3])
    i+=3
print(result)

**output**

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


我修复了代码,有很多错误。但是我不确定这是否解决了问题。我会将答案投反对票。 - Joe Ferndz
@JoeFerndz,我能知道你在这个问题上修复了什么吗?你运行过代码了吗? - Sindhukumari P
因为我记得写了可行的代码。你做了哪些改动? - Sindhukumari P

-1

你有任何从原始列表中进行筛选的标准吗?

Python确实允许您这样做:

new_list = []
new_list.append(data_list[:3])
new_list.append(data_list[3:6])
new_list.append(data_list[6:])

print new_list
# Output:  [ [0,1,2] , [3,4,5] , [6,7,8] ]

1
就此而言,当您尝试概括OP所描述的模式时,这并不是非常实用的。谢谢。 - eat
哦,我不知道OP是在想Python中是否可能嵌套列表,还是有一种方法将列表转换为嵌套列表。 - Manny D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接