Python中从含字符串与整数的嵌套列表按字符串分组提取最小整数的实现方法
Python中从含字符串与整数的嵌套列表按字符串分组提取最小整数的实现方法
嘿,这个需求我刚好有几个实用的实现思路,咱们一步步来搞定它!
先再明确下你的需求场景:
我有一个如下的嵌套列表,想要按相同的字符串分组,提取每组里最小的整数,返回新的嵌套列表
输入列表:li=[['a', 10], ['a', 20], ['a', 20], ['a', 40], ['a', 50], ['a', 60] , ['b', 10], ['b', 20], ['b', 30], ['b', 40] , ['c', 10], ['c', 10], ['c', 20]]期望返回:
min_li=[['a', 10], ['b', 10], ['c', 10]]
下面给你三种不同的实现方法,你可以根据自己的使用场景来选:
方法一:纯基础Python字典实现(新手友好,无需额外库)
这个思路特别直接,用字典来存每个字符串对应的最小整数:遍历原列表的时候,把字符串当字典的键,遇到新的键就直接存对应的数字;如果键已经存在,就对比当前数字和字典里已存的最小值,保留更小的那个。最后把字典的键值对转成你要的嵌套列表就行。
代码如下:
li = [['a', 10], ['a', 20], ['a', 20], ['a', 40], ['a', 50], ['a', 60], ['b', 10], ['b', 20], ['b', 30], ['b', 40], ['c', 10], ['c', 10], ['c', 20]] # 初始化空字典用来存每个键的最小值 min_dict = {} for key, num in li: # 键不存在,或者当前数字更小就更新 if key not in min_dict or num < min_dict[key]: min_dict[key] = num # 把字典转成目标格式的嵌套列表 min_li = [[k, v] for k, v in min_dict.items()] print(min_li)
运行后就能得到你想要的结果,这个方法没有任何依赖,理解起来也简单,日常处理中小规模的数据完全够用。
方法二:用itertools.groupby(标准库工具,适合熟悉库的同学)
如果你想用Python标准库的工具来实现,可以用itertools.groupby,不过要注意一个关键点:groupby只能把连续的相同键分到一组,所以我们得先把原列表按字符串键排好序,再进行分组求最小。
代码实现:
from itertools import groupby li = [['a', 10], ['a', 20], ['a', 20], ['a', 40], ['a', 50], ['a', 60], ['b', 10], ['b', 20], ['b', 30], ['b', 40], ['c', 10], ['c', 10], ['c', 20]] # 先按第一个元素(字符串键)排序,确保相同键连续 sorted_li = sorted(li, key=lambda x: x[0]) min_li = [] # 按字符串键分组,遍历每个组 for key, group in groupby(sorted_li, key=lambda x: x[0]): # 从组里提取所有数字,取最小值 min_num = min(item[1] for item in group) min_li.append([key, min_num]) print(min_li)
这个方法很符合Pythonic的风格,适合已经对标准库有一定了解的朋友。
方法三:用pandas(大数据量场景首选)
如果你的数据量比较大,或者平时经常处理表格型数据,用pandas来实现会超级简洁,一行核心代码就能搞定分组求最小,再转成你要的列表格式。
代码如下:
import pandas as pd li = [['a', 10], ['a', 20], ['a', 20], ['a', 40], ['a', 50], ['a', 60], ['b', 10], ['b', 20], ['b', 30], ['b', 40], ['c', 10], ['c', 10], ['c', 20]] # 转成DataFrame,按key分组取num的最小值,再转成嵌套列表 df = pd.DataFrame(li, columns=['key', 'num']) min_li = df.groupby('key')['num'].min().reset_index().values.tolist() print(min_li)
pandas在处理大规模数据时的性能优势非常明显,而且代码可读性极强,适合数据处理场景较多的同学。
备注:内容来源于stack exchange,提问作者Liu Yu
相关产品推荐
相关产品推荐

