我有一堆x和y坐标的在文本文件中,其中,每第二个数字是一个X- / y坐标(如下所示)。我已经写的数字到一个数组,但现在我不得不在每个第二编号的数组分成子阵列,包含x和y坐标。我该怎么做呢?
coordinates.txt
x y x y x y
10 30 40 50 60 70
假设你的数组总是以X制成,y对,(即LEN(阵列)始终是2的倍数),那么你可以这样做:
a = [10,30,40,50,60,70]
xy_pairs = [a[n:n+2] for n in range(len(a)) if not n%2]
>>> print(xy_pairs)
[[10, 30], [40, 50], [60, 70]]
如果你想保持x和分离的y值,那么你可以这样做:
xs = [a[n] for n in range(len(a)) if not n%2]
ys = [a[n] for n in range(len(a)) if n%2]
>>> print(xs)
[10, 40, 60]
>>> print(ys)
[30, 50, 70]
后者也可以使用,而不是被认为是更Python enumerate(a)
range(len(a))
来完成。
xs = [n for i,n in enumerate(a) if not i%2]
ys = [n for i,n in enumerate(a) if i%2]
您可以使用zip
和切片容易做到这一点:
zip(numbers[::2], numbers[1::2])
numbers[::2]
只需偶数指数(在0
开始明显),而[1::2]
取奇数的。 zip
“对”两个列表的元素。
需要注意的是zip
产生的迭代器。如果你想获得它的实际列表呼叫list
:
>>> list(zip(numbers[::2], numbers[1::2]))
[(10, 30), (40, 50), (60, 70)]
你可以使用一些魔法itertools:
from itertools import izip_longest
data = "10 30 40 50 60 70"
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
for x,y in grouper(data.split(" "), 2):
print(x, y)
这将产生
('10', '30')
('40', '50')
('60', '70')
从original website无耻地抄袭,还看到a demo on ideone.com。
尝试列表解析方法中,通过使用2的步骤的规模的原始列表。
op_list = [10,30,40,50,60,70]
new_list = [[op_list[i], op_list[i+1]] for i in range(0, len(op_list), 2)]
print new_list
输出:
[[10, 30], [40, 50], [60, 70]]
您可以使用该功能zip()
于迭代:
l = [10,30,40,50,60,70]
l = iter(l)
l = [[i, j] for i, j in zip(l, l)]
# [[10, 30], [40, 50], [60, 70]]