Python 从列表列表到列表列表列表

Python 从列表列表到列表列表列表,python,list,folium,Python,List,Folium,我有这样一份清单: first_list = [[ 1. , 45.4, 9.1], [ 2. , 45.5, 9.1], [ 2. , 45.4, 9.2], [ 2. , 45.4, 9.2], [ 3. , 45.4, 9.1], [ 3. , 45.4,

我有这样一份清单:

first_list = [[ 1.        , 45.4,  9.1],
              [ 2.        , 45.5,  9.1],
              [ 2.        , 45.4,  9.2],
              [ 2.        , 45.4,  9.2],
              [ 3.        , 45.4,  9.1],
              [ 3.        , 45.4,  9.1],
              [ 3.        , 45.4,  9.1] ]

我想使用folio函数HeatMapWithTime,为此我需要根据每个子列表1,2,3的第一项对上面的数据进行分组。幼儿保育:

new_list = [ [ [45.4, 9.1] ],                               # All coords for 1.
             [ [45.5, 9.1], [45.4, 9.2], [45.4, 9.2] ],     # All coords for 2.
             [ [45.4, 9.1], [45.4, 9.1], [45.4, 9.2] ] ]    # All coords for 3.

我怎样才能做到这一点呢?

假设列表按第一个元素排序,您可以使用:


一种方法是首先对列表进行排序:

lst_data = sorted(first_list)
然后循环它,当第一个索引更改时创建一个新的ljst:

first_index = None
final_lst = []
for i in lst_data:
    if i[0] != first_index:
        final_lst.append([])
        first_index = i[0]
    final_lst[-1].append(i[1:])

我会使用dict,如果您需要它作为一个列表,您可能希望将它带回一个列表,但是使用dict进行分组通常是有帮助的:

first_list = [[ 1.        , 45.4,  9.1],
              [ 2.        , 45.5,  9.1],
              [ 2.        , 45.4,  9.2],
              [ 2.        , 45.4,  9.2],
              [ 3.        , 45.4,  9.1],
              [ 3.        , 45.4,  9.1],
              [ 3.        , 45.4,  9.1] ]
result = dict()
for group, *values in first_list:
    if group not in result:
        result[group] = [values]
    else:
        result[group].append(values)
print(result)
### if you want it back as a list:
result_list = [v for k,v in result.items()]
print(result_list)
输出:

#dict:
{1.0: [[45.4, 9.1]], 2.0: [[45.5, 9.1], [45.4, 9.2], [45.4, 9.2]], 3.0: [[45.4, 9.1], [45.4, 9.1], [45.4, 9.1]]}
#list:
[[[45.4, 9.1]], [[45.5, 9.1], [45.4, 9.2], [45.4, 9.2]], [[45.4, 9.1], [45.4, 9.1], [45.4, 9.1]]]

可以在字典中收集所有坐标:

res = {}
for entry in first_list:
    res.setdefault(entry[0], []).append(entry[1:])
这将为您提供:

>>> res
{1.0: [[45.4, 9.1]],
 2.0: [[45.5, 9.1], [45.4, 9.2], [45.4, 9.2]],
 3.0: [[45.4, 9.1], [45.4, 9.1], [45.4, 9.1]]}
如果列表已排序,请仅将值转换为Python 3.6+的列表:

>>> list(res.values())
[[[45.4, 9.1]],
 [[45.5, 9.1], [45.4, 9.2], [45.4, 9.2]],
 [[45.4, 9.1], [45.4, 9.1], [45.4, 9.1]]]
否则,您需要首先对它们进行排序:

>>> [res[key] for key in sorted(res.keys())]
[[[45.4, 9.1]],
 [[45.5, 9.1], [45.4, 9.2], [45.4, 9.2]],
 [[45.4, 9.1], [45.4, 9.1], [45.4, 9.1]]]
使用pandas的一种解决方案,是处理复杂数据格式时的明智选择:

import pandas as pd    
pd.DataFrame(first_list).set_index(0).groupby(df.index).apply(lambda x: x.values.tolist()).tolist()
#-> 
[[[45.4, 9.1]],
 [[45.5, 9.1], [45.4, 9.2], [45.4, 9.2]],
 [[45.4, 9.1], [45.4, 9.1], [45.4, 9.1]]]

'如果您的列表已排序,请将值转换为列表'您确定吗?我认为字典不保留顺序从Python3.6开始就保留插入顺序。太好了,我使用的是pandas,所以我回到了原来的df并运行了这个命令:heat_list=df.groupbydf.day.applylambda x:x.values.tolist.tolist。输出返回如下子列表:[1.0,45.44430542,9.16762733],但我不需要第一个元素,只需要lat和lon。我该怎么做?@Ibarrond pandas确实很有用,但我认为这个解决方案非常复杂,将来很难调试,我怀疑它可能会很慢。我同意,但我经常使用pandas,这就是为什么我想用这种方式解决问题。@Nathan如果你一步一步地执行每个操作,你可以非常轻松地调试它。WRT performance,除非有问题,否则提供一个超快的解决方案是没有意义的,而是一个可以理解和重用的解决方案。@alcor我会尝试这样的方法:heat_list=df.groupbydf.day.applylambda x:x.values[1:]tolist.tolist。请注意[1:]以删除第一个元素
import pandas as pd    
pd.DataFrame(first_list).set_index(0).groupby(df.index).apply(lambda x: x.values.tolist()).tolist()
#-> 
[[[45.4, 9.1]],
 [[45.5, 9.1], [45.4, 9.2], [45.4, 9.2]],
 [[45.4, 9.1], [45.4, 9.1], [45.4, 9.1]]]