将元组列表更改为2个列表 - Python

时间:2016-09-11 22:21:04

标签: python tuples ipython

我有一个元组列表(在这种情况下是纬度和经度的坐标)

[(51.69768233153901, -5.039923897568534),
(52.14847612092221, 0.33689512047881015),
(52.14847612092221, 0.33689512047881015),
....]

我试图将它们分成两个单独的列表(一个用于纬度,一个用于经度)

我无法弄清楚如何循环将它们添加到列表中,到目前为止我已经:

lat = latlon_df.at[0,'LatLon'][0] 
lon = latlon_df.at[0,'LatLon'][1]

标识每个中的第一个。有人可以告诉我如何创建2个新列表吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:7)

试试这个:

coords = [(51.69768233153901, -5.039923897568534),
          (52.14847612092221, 0.33689512047881015),
          (52.14847612092221, 0.33689512047881015)]

lat, lon = map(list, zip(*coords))

根据此答案改编Transpose/Unzip Function (inverse of zip)?

答案 1 :(得分:0)

如果我列出具有列表理解的元组列表,如:

In [131]: ll = [(i,j) for i,j in zip(range(10),range(5,15))]
In [132]: ll
Out[132]: 
[(0, 5),
 (1, 6),
 (2, 7),
 (3, 8),
 (4, 9),
 (5, 10),
 (6, 11),
 (7, 12),
 (8, 13),
 (9, 14)]

我可以轻松地将其拆分为2个列表,其中包含2个列表推导:

In [133]: [i[0] for i in ll], [i[1] for i in ll]
Out[133]: ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

是的,它涉及两次循环ll,但是如果试图找到一种只做一次循环的方法,我就会多次循环它。有时简单直接的方法更好。

话虽如此,有transpose的列表版本可以完成工作

In [134]: list(zip(*ll))
Out[134]: [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), (5, 6, 7, 8, 9, 10, 11, 12, 13, 14)]

这给出了一个包含2个元组的列表,每个元组都有一个'列'原来的。我的原始构造函数可以简化为

list(zip(range(10),range(5,15)))

所以list(zip(*...来回翻转列表。

但是:

lat = latlon_df.at[0,'LatLon'][0]

建议元组列表实际上可能是pandas数据帧。 pandas可能有自己的索引工具。您之前在数据框术语中询问过这个问题

Removing round brackets from a dataframe of lat/lon pairs

如果列表实际上是结构化数组:

In [143]: arr=np.array(ll, dtype='i,i')

打印显示看起来很像元组列表(虽然遗漏了一些),

In [144]: print(arr)
[(0, 5) (1, 6) (2, 7) (3, 8) (4, 9) (5, 10) (6, 11) (7, 12) (8, 13) (9, 14)]
In [145]: arr
Out[145]: 
array([(0, 5), (1, 6), (2, 7), (3, 8), (4, 9), (5, 10), (6, 11), (7, 12),
       (8, 13), (9, 14)], 
      dtype=[('f0', '<i4'), ('f1', '<i4')])

很容易选择字段&#39;按名称:

In [146]: arr['f0']
Out[146]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32)
In [147]: arr['f1']
Out[147]: array([ 5,  6,  7,  8,  9, 10, 11, 12, 13, 14], dtype=int32)

答案 2 :(得分:-1)

使用列表理解:

lats, lons = [[coord[index] for coord in coords] for index in (0,1)]

请注意,对于大型坐标列表,使用列表推导比map-list-zip方法快半个数量级:

enter image description here

相关问题