假设我们有一个仅True
或False
的值列表。唯一标记True
每个分组的最佳方式是什么,即True
被条目False
包围的群组? (所有值False
都应转换为0)
list1 = [True, False, False, False, False, True, True, True, False, True, True, True, True, True, False, False, True, False, False, False, False, True, True, True, False, True, True, True, True, True, False, False]
在转换后的表格中,此列表为:
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循环。
答案 0 :(得分:4)
这是一个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]
没有单词for
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]