如何在不使用for循环的情况下计算列表元素的计数与首次出现标记?
不用for循环实现需求的两种方法
嘿,这个需求其实有挺简洁的实现方式,完全不用手写for循环!下面给你两种方案,按需选择:
方案一:用Pandas(最直观简洁)
Pandas的分组功能刚好能完美匹配你的需求,代码量很少:
import pandas as pd a = ['Car_1','Car_1','Car_1','Car_2','Car_3','Car_3'] s = pd.Series(a) # 生成result_count1:新车型出现时标记1 result_count1 = (s.groupby(s).cumcount() == 0).astype(int).tolist() # 生成result_count2:统计各车型的累计出现次数 result_count2 = (s.groupby(s).cumcount() + 1).tolist() print(result_count1) # 输出: [1,0,0,1,1,0] print(result_count2) # 输出: [1,2,3,1,1,2]
简单解释:
groupby(s)按车型分组;cumcount()会给每个分组内的元素从0开始计数;- 对于
result_count1,判断计数是否为0(也就是分组的第一个元素),转成int后就是1和0的列表; - 对于
result_count2,把计数加1就得到了从1开始的累计次数。
方案二:用标准库itertools(无需额外安装依赖)
如果不想用第三方库,用Python自带的itertools.groupby也能实现:
from itertools import groupby, chain a = ['Car_1','Car_1','Car_1','Car_2','Car_3','Car_3'] # 生成result_count1 result_count1 = list(chain.from_iterable([1] + [0]*(len(list(g))-1) for _, g in groupby(a))) # 生成result_count2 result_count2 = list(chain.from_iterable(range(1, len(list(g))+1) for _, g in groupby(a))) print(result_count1) # 输出: [1,0,0,1,1,0] print(result_count2) # 输出: [1,2,3,1,1,2]
简单解释:
groupby(a)会把连续的相同车型分成组;- 对于每个组,
[1] + [0]*(len(g)-1)会生成第一个元素为1,后面全是0的子列表; range(1, len(g)+1)会生成从1到组长度的连续数字,刚好是累计次数;- 最后用
chain.from_iterable把所有子列表拼接成一个大列表。
⚠️ 注意:itertools.groupby只对连续的相同元素分组,如果你的原列表里相同车型不是连续的,这个方法就不适用了,这时候Pandas的方案会更可靠,因为它不要求元素连续。
内容的提问来源于stack exchange,提问作者Saketh Garuda
相关产品推荐
相关产品推荐

