作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图将列表中的元素分组以压缩它并使其保持相同的顺序,但前提是它满足某些条件。
假设我有一个列表,我使用此列表理解来压缩它:
>> 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]
关于python - 有没有办法使用列表理解来计算特定条件下按元素分组的频率,但不计算其他元素的频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54243840/
我是一名优秀的程序员,十分优秀!