Python 是否有一种方法可以使用列表理解来计算特定条件下按元素分组的频率,而不计算其他元素的频率?
我试图将列表中的元素分组,以将其压缩并保持相同的顺序,但前提是它满足某些条件 假设我有一个列表,我用这个列表压缩它:Python 是否有一种方法可以使用列表理解来计算特定条件下按元素分组的频率,而不计算其他元素的频率?,python,list-comprehension,Python,List Comprehension,我试图将列表中的元素分组,以将其压缩并保持相同的顺序,但前提是它满足某些条件 假设我有一个列表,我用这个列表压缩它: >> 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] 期望输出: >&g
>> 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”来创建新列表,但是我有什么选择呢?使用具有以下内容的生成器表达式: 在我看来,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]
不使用列表理解
from itertools import groupby
l = [1,1,2,2,3,3,4,4,4,"7","7","7",5,5]
out=[]
for key, group in groupby(l):
if not isinstance(key, str):
out.append(len(list(group)))
else:
out.extend(list(group))
输出
[2,2,2,3,'7','7','7',2]
如果键是字符串,则可以使用嵌套列表理解逐个迭代分组项:
from itertools import groupby
[i for k, g in groupby(l) for i in (list(g) if isinstance(k, str) else (len(list(g)),))]
这将返回:
[2, 2, 2, 3, '7', '7', '7', 2]
我同意你的看法,第二个选择更干净。为什么
out.extend(key*len(list(group))
而不是out.extend(list(group))
?@我知道我做得太过分了。谢谢
[2, 2, 2, 3, '7', '7', '7', 2]