当前位置: 首页 > 知识库问答 >
问题:

python - 一个简单的问题,不借助pandas,二维列表如何快速分组?

孟祯
2024-10-11

一个简单的问题,不借助pandas,二维列表如何快速分组?
[['A',33],['A',0],['A',12],['A',3],['B',3],['B',0],['B',77],['C',1],['C',2],['C',5],['C',0],['C',11],['C',19]]
或者
[['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C'], [33, 0, 12, 3, 3, 0, 77, 1, 2, 5, 0, 11, 19]]
分组是连续的,分组长度不等,根据组名分组,保持原来的顺序,不用while遍历有现存的库代码吗?列表较大,我担心用pandas速度较慢
[[33,0,12,3],[3,0,77],[1,2,5,0,11,19]]

本来不想用append,担心数组大了速度问题,还是先用append凑合

data = [['A',33],['A',0],['A',12],['A',3],['B',3],['B',0],['B',77],['C',1],['C',2],['C',5],['C',0],['C',11],['C',19]]
def group_name_fun(lst):

last=''
arr=[]
for ii in range(len(lst)):
    if not lst[ii][0]==last:
        arr.append(ii)
        last=lst[ii][0]
arr.append(len(lst))
lst=[lst[arr[ii-1]:arr[ii]] for ii in range(1, len(arr))]
return lst

print(group_name_fun(data))

共有2个答案

唐博文
2024-10-11

要在不使用 append 的情况下处理大数组,可以考虑使用生成器或者 itertools 这样的模块来进行高效处理。这种方法可以减少内存占用并提高处理速度。以下是使用 itertools 模块的解决方案:

使用 itertools 模块处理大数组

import itertools

def group_large_array(data):
    grouped_data = {}
    for key, group in itertools.groupby(data, lambda x: x[0]):
        grouped_data[key] = [item[1] for item in group]
    
    # 转换为列表形式
    result = [grouped_data[key] for key in grouped_data]
    return result

# 测试数据
data = [['A', 33], ['A', 0], ['A', 12], ['A', 3], ['B', 3], ['B', 0], ['B', 77], ['C', 1], ['C', 2], ['C', 5], ['C', 0], ['C', 11], ['C', 19]]
print(group_large_array(data))

解释

  1. itertools.groupby:我们使用 itertools.groupby 按照键值对数据进行分组。
  2. list comprehension:使用列表推导式将每组的数据提取出来。

这种方法避免了显式使用 append,并且在处理大数组时具有较高的效率。通过生成器和 itertools 模块,内存占用也能得到有效控制。

商皓
2024-10-11

不借助pandas或其他专门的库来直接实现分组,并且要求保持原始顺序,同时避免使用while循环,你可以使用Python的字典和列表推导式来手动实现这一功能。下面是一个示例代码,它按照你的要求将二维列表按组名分组:

# 原始数据
data = [['A',33],['A',0],['A',12],['A',3],['B',3],['B',0],['B',77],['C',1],['C',2],['C',5],['C',0],['C',11],['C',19]]

# 初始化一个空字典来存储分组结果
grouped = {}

# 遍历原始数据,根据第一个元素(组名)进行分组
for item in data:
    group_name = item[0]
    if group_name not in grouped:
        grouped[group_name] = []
    grouped[group_name].append(item[1])

# 将分组结果转换为列表形式,并保持顺序(根据字典的键的顺序)
result = [grouped[key] for key in sorted(grouped.keys())]

print(result)

这段代码首先创建了一个空字典grouped来存储分组后的数据。然后,它遍历原始数据列表data,根据每个子列表的第一个元素(即组名)将数据分组。分组完成后,它使用列表推导式和sorted()函数(按字典键排序)来生成最终的分组列表,该列表保持了原始数据中组名的顺序。

注意,这个解决方案假设组名在原始数据中是按照你想要保持的顺序出现的。如果组名的顺序在原始数据中是不确定的,但你希望结果中组名有特定的顺序(比如按字母顺序),则sorted()函数将确保这一点。如果原始数据中组名的顺序已经是你想要的顺序,且你知道这一点,那么你可以直接遍历字典的键(而不是先排序)来构建结果列表,但这通常不是必需的,因为字典的键在Python 3.7+中是按照插入顺序存储的(尽管这被视为实现细节,但在现代Python版本中通常可以安全地依赖这一点)。

 类似资料:
  • 本文向大家介绍python实现两个一维列表合并成一个二维列表,包括了python实现两个一维列表合并成一个二维列表的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,直接上代码吧! 以上这篇python实现两个一维列表合并成一个二维列表就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 我有一个这样的清单: 我想要这样的结果(列表中的 每个 第一个元素): 我尝试了[:: 1] [0],但没有用 我几周前才开始学习Python。Python版本= 2.7.9 问题答案: 您可以从列表理解中的每个元素获取索引 同样,要学究,您没有的,您没有的。

  • 如果我已经提交过了,但又有了一些新修改希望加入提交,但又不想再创建一个提交,我应该怎么做? 我知道可以 但这样操作很繁琐. 亦或者 但这样得把之前打印过的评论再输入一遍很麻烦感觉. 我觉得肯定有一条指令一行就能把这事搞定?

  • 有两张表,分别储存产品信息与检测信息 检测信息表procheck中pro_id关联到产品信息表pro中的id,每个产品对应有多个检测信息记录 我现在需要把某个公司(产品表中company_id)生产的所有产品的最新一次检测报告调出来? 但是得出的结果却是: 全部给我找了出来,而我真正需要的是箭头上的三条即可。 求SQL语句.....

  • 问题内容: 我有一列如下所示的熊猫: 我需要将列表的此列分为2列,并使用。 问题答案: 您可以使用与构造函数通过转换为创建通过使用: 对于新的DataFrame: 解决方案apply(pd.Series)非常慢:

  • 我们在第 1 章已经看到了一个简单的 Hello World 的例子,相信你已经成功地把它跑起来了,下面我们对这个程序进行讲解。回顾一下这个程序: $ cat hello.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name_