python - 有没有一种方法可以使用列表理解来计算按元素分组的频率在特定条件下而不是其他元素?
问题描述
我试图将列表中的元素分组以压缩它并保持相同的顺序,但前提是它满足某些条件。
假设我有一个列表,我使用这个列表理解来压缩它:
>> l = [1,1,2,2,3,3,4,4,4,"7","7","7",5,5]
>> [len(list(group)) if not isinstance(key, str) else key for key, group in groupby(l)]
输出:
>> [2, 2, 2, 3, '7', 2]
期望的输出:
>> [2, 2, 2, 3, '7', '7', '7', 2]
所以我只想要元素的频率,如果它是一个数字,但如果它是一个字符串,我希望列出每一个出现而不是只列出一次。
我理解它是因为理解是使用“groupby(l)”而不是“l”来创建新列表,但我有什么替代方案?
解决方案
使用生成器表达式chain.from_iterable
:
from itertools import chain, groupby
L = [1,1,2,2,3,3,4,4,4,"7","7","7",5,5]
gen = ([len(list(g))] if not isinstance(k, str) else list(g) for k, g in groupby(L))
res = list(chain.from_iterable(gen))
# [2, 2, 2, 3, '7', '7', '7', 2]
在我看来,Cleaner 正在为此定义一个函数:
from itertools import chain, groupby
def func(args):
key, grp = args
lst = list(grp)
if not isinstance(key, str):
yield len(lst)
else:
yield from lst
res = list(chain.from_iterable(map(func, groupby(L))))
# [2, 2, 2, 3, '7', '7', '7', 2]
推荐阅读
- jquery - 如何将请求有效负载作为 JSON 发送
- java - 如何通过spring rest api接受固定长度的消息
- bash - 在 bash 中使用通配符和包含空格的路径
- kubernetes - Base64 编码正在添加一个新行
- sql - 根据同一张表的前几列中的值设置值?(甲骨文)
- sharepoint - 共享的共享点权限
- arrays - 如何在颤动中从数组中获取随机变量
- python - Docker 中的 Cron 作业不工作 - python 应用程序
- angular - Jest 测试失败,因为在使用 quill 编辑器测试组件时缺少 angular 10 中的动态导入
- jdbc - 结果集的 JDBC 事务