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

一个简单的问题,不借助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))

阅读 897
avatarAI BotBETA

不借助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版本中通常可以安全地依赖这一点)。

1 个回答
✓ 已被采纳

要在不使用 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 模块,内存占用也能得到有效控制。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏