使用循环在Python中填充数组

5
我的问题如下,我有一个名为crave=['word1','word2','word3'....'wordx']的数组,我想将其转换为ITEM=[['word1','word2','word3'],['word4','word5','word6']等]。我使用了以下代码。
buff=[['none','none','none']]
n=10
ITEM=[]
i=0
while 1>0 :


 buff[0][0]=crave[i]
 buff[0][1]=crave[i+1]
 buff[0][2]=crave[i+2]
 ITEM.insert(len(ITEM),buff[0])
 i=i+3
 if i>n:
      break

但是实际上我得到的是 [['wordx-2','wordx-1','wordx'],['wordx-2','wordx-1','wordx'],['wordx-2','wordx-1','wordx']等等],为什么会这样呢? :(

你想把列表分成三个元素的子列表吗?顺序很重要吗? - Moj
1
我试图理解你的代码是做什么的,我不得不更改一些行使其编译和运行。这是我所做的:https://ideone.com/bHuDx2 - Wolf
是的,顺序很重要。 - Cross Man
4个回答

10
你可以轻松地使用列表推导式来完成此操作。 xrange(0, len(crave), 3)用于从0到len(crave)以3为间隔进行迭代,然后我们使用列表切片 crave[i:i+3]来提取所需的数据。
crave=['word1','word2','word3','word4','word5','word6','word7']

ITEM = [crave[i:i+3] for i in xrange(0, len(crave), 3)]

print ITEM
>>> [['word1', 'word2', 'word3'], ['word4', 'word5', 'word6'], ['word7']]

1
有趣的是,尤其是最后一个(“broken”)三元组的处理 - 它真的有效 :-) https://ideone.com/S9AQF7 - Wolf
感谢您的赞赏,@Wolf。 - ZdaR

4
尝试这个。
crave = ['word1', 'word2', 'word3', 'word4', 'word5', 'word6', 'word7']
li = []
for x in range(0, len(crave), 3):
    li.append(crave[x:x+3])
print li

1
解释了列表推导式;-) - Wolf

1
import numpy as np
In [10]: a =np.arange(20)

In [11]: a
Out[11]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])

In [12]: np.array_split(a,len(a)/3)
Out[12]: 

[array([0, 1, 2, 3]),
 array([4, 5, 6, 7]),
 array([ 8,  9, 10]),
 array([11, 12, 13]),
 array([14, 15, 16]),
 array([17, 18, 19])]

1

关于“为什么会出现这种情况”的问题:

问题在于,.insert 引用的是 buff[0],而不是拷贝。因此,在下一次循环中,当 buff 发生任何变化时,引用 buff 的任何内容也会发生变化。

要进行明确的复制,请使用 list()。例如:

 ITEM.insert(len(ITEM),list(buff[0]))

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