Python 给定真/假的列表/数组,我们如何标记真的集群?
假设我们有一个仅为Python 给定真/假的列表/数组,我们如何标记真的集群?,python,list,iteration,Python,List,Iteration,假设我们有一个仅为True或False的值列表。对True的每一组(即被False条目包围的True组)进行唯一标记的最佳方法是什么?(所有值False应转换为0) 在转换后的表格中,此列表将是: list1 = [1, 0, 0, 0, 0, 2, 2, 2, 0, 3, 3, 3, 3, 3, 0, 0, 4, 0, 0, 0, 0, 5, 5, 5, 0, 6, 6, 6, 6, 6, 0, 0] 我面临的挑战是,不需要for循环就可以快速完成这项任务。这里有一个itertools.gr
True
或False
的值列表。对True
的每一组(即被False
条目包围的True
组)进行唯一标记的最佳方法是什么?(所有值False
应转换为0)
在转换后的表格中,此列表将是:
list1 = [1, 0, 0, 0, 0, 2, 2, 2, 0, 3, 3, 3, 3, 3, 0, 0, 4, 0, 0, 0, 0, 5, 5, 5, 0, 6, 6, 6, 6, 6, 0, 0]
我面临的挑战是,不需要for循环就可以快速完成这项任务。这里有一个itertools.groupby解决方案
b
# [False, True, True, False, True, True, False, True, True, False, True, False, False, False, False, True, True, True, True, False]
list(itertools.chain((k * j // 2 for j, (k, g) in enumerate(itertools.groupby(b), 2) for l in g)))
# [0, 1, 1, 0, 2, 2, 0, 3, 3, 0, 4, 0, 0, 0, 0, 5, 5, 5, 5, 0]
没有用于
sum(map(lambda jkg: [jkg[1][0] * jkg[0] // 2] * len(list(jkg[1][1])), enumerate(itertools.groupby(b), 2)), [])
# [0, 1, 1, 0, 2, 2, 0, 3, 3, 0, 4, 0, 0, 0, 0, 5, 5, 5, 5, 0]
# OP's example
sum(map(lambda jkg: [jkg[1][0] * jkg[0] // 2] * len(list(jkg[1][1])), enumerate(itertools.groupby(list1), 2)), [])
# [1, 0, 0, 0, 0, 2, 2, 2, 0, 3, 3, 3, 3, 3, 0, 0, 4, 0, 0, 0, 0, 5, 5, 5, 0, 6, 6, 6, 6, 6, 0, 0]
这是一个itertools.groupby解决方案
b
# [False, True, True, False, True, True, False, True, True, False, True, False, False, False, False, True, True, True, True, False]
list(itertools.chain((k * j // 2 for j, (k, g) in enumerate(itertools.groupby(b), 2) for l in g)))
# [0, 1, 1, 0, 2, 2, 0, 3, 3, 0, 4, 0, 0, 0, 0, 5, 5, 5, 5, 0]
没有用于
sum(map(lambda jkg: [jkg[1][0] * jkg[0] // 2] * len(list(jkg[1][1])), enumerate(itertools.groupby(b), 2)), [])
# [0, 1, 1, 0, 2, 2, 0, 3, 3, 0, 4, 0, 0, 0, 0, 5, 5, 5, 5, 0]
# OP's example
sum(map(lambda jkg: [jkg[1][0] * jkg[0] // 2] * len(list(jkg[1][1])), enumerate(itertools.groupby(list1), 2)), [])
# [1, 0, 0, 0, 0, 2, 2, 2, 0, 3, 3, 3, 3, 3, 0, 0, 4, 0, 0, 0, 0, 5, 5, 5, 0, 6, 6, 6, 6, 6, 0, 0]
基于另一个不带循环的列表创建一个全新的列表?基于另一个不带循环的列表创建一个全新的列表?我不知道,我在其中两次看到了
for
。列表(itertools.chain(*map(lambda s:map(lambda x:x*s[0]//2,s[1][1]),枚举(itertools.groupby(b,2)))
所以我们可以假装没有循环?;-)@零比雷埃夫斯谢谢,我到达的或多或少是一样的。你的稍微优雅一点。嗯,事实上,这在我的例子中不起作用-(我不知道,我两次看到了,列表(itertools.chain(*map(lambda s:map)(lambda x:x*s[0]//2,s[1][1]),枚举(itertools.groupby(b,2)))
这样我们就可以假装没有循环了吗?;-)@ZeroPiraeus谢谢,我差不多也到了。你的稍微优雅一点。嗯,事实上,这在我的例子中不起作用-(