如何使用现有元素将一维列表更改为二维?

时间:2014-11-06 18:36:13

标签: python

我正在阅读一个文本文件,其中包含几个列表,每个列表都有自己的行。给定列表中的元素是非整数x,y坐标,需要放入数组中,以便:

  

[x1,y1,x2,y2,x3,y3,.... xn,yn]

变为:

  

x1 x2 x3 .... xn

     

y1 y2 y3 .... yn

但是在同一个2d阵列中。

我对编码很新,尝试了各种方法,但无济于事。现在我循环遍历坐标对的数量,并尝试在循环中追加值但不确定如何执行此操作。

这就是我开始的方式:

with open('textfile.txt', 'r') as infile:
    for line in infile:
        array=[]
        number=(line.count(" ")+1)/2 #number of x,y pairs in list
        for i in range(0, number-1):

现在我不知道从哪里开始,所以任何帮助都将不胜感激!感谢

5 个答案:

答案 0 :(得分:1)

由于您不熟悉python并且处理数值数据,因此您可能需要考虑事实上的标准模块进行此类操作,numpy。有了它,你的问题就变得微不足道了:

import numpy as np

A = [1,2,3,4,5,6,7,8]
print np.array(A).reshape((len(A)/2,2)).T

>>> [[1 3 5 7]
     [2 4 6 8]]

在这里,我们将列表转换为numpy数组np.arrayreshape将其转换为我们想要的大小,并将转置T(x1,y1),(x2,y2),...转换为{{ 1}}。

答案 1 :(得分:0)

您可以使用2列表切片作为其步骤:

>>> l=['x1', 'y1', 'x2', 'y2', 'x3', 'y3']
>>> l[0::2]
['x1', 'x2', 'x3']
>>> l[1::2]
['y1', 'y2', 'y3']

或者您可以使用itertools.cycle并使用next()抛出您的列表:

>>> from itertools import cycle
>>> l=['x1', 'y1', 'x2', 'y2', 'x3', 'y3']
>>> c=cycle(l)

>>> l1=[]
>>> l2=[]
>>> for i in range(len(l)/2):
...  l1.append(c.next())
...  l2.append(c.next())
... 
>>> l1
['x1', 'x2', 'x3']
>>> l2
['y1', 'y2', 'y3']

答案 2 :(得分:0)

如果你有一个像

这样的清单
a = [1,2,3,4]

你可以做到

b = [a[0:len(a)-1:2], a[1:len(a):2]]

将返回一个包含两个列表的列表(一种2D python数组)

>>> [[1, 3], [2, 4]]

如果您确定阵列的长度是均匀的,那么这实际上是有效的。

答案 3 :(得分:0)

假设a是您的给定列表。然后,您可以为单独的列表调用这两个命令:

b=[a [i]  for i in range (len (a)) if i % 2==0]
c=[a [i]  for i in range (len (a)) if i % 2==1]

答案 4 :(得分:0)

改编自grouper recipe

def grouper(iterable,n):
    return zip(*([iter(iterable)]*n))

print grouper(range(9),3)
# [(0, 1, 2), (3, 4, 5), (6, 7, 8)]

# if len(iterable)%n : truncation
print grouped(range(14),3)
# [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)]