给定一个True / False的列表/数组,我们如何标记True的簇?

时间:2017-03-15 20:56:36

标签: python list iteration

假设我们有一个仅TrueFalse的值列表。唯一标记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循环。

1 个答案:

答案 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]