填充数字字典,记录比特串左右两侧的1的数量

4
我有一个位串,如下所示:1101100111,我想构建一个字典,记录任何零左侧和右侧的一的数量,例如: left = {2: 2, 5: 2, 6: 0}, right = {2: 2, 5: 0, 6: 3} 在这些字典中,键是索引,值是一的数量。 在索引2处,左侧有2个1,右侧也有2个1。 在索引5处,左侧有2个1,右侧没有1。 在索引6处,左侧没有1,右侧有3个1。
这是我的代码:
    left, right, zeroes = {}, {}, []
    last_zero, last_one = 0, 0

    for i, v in enumerate(nums):
        if v == 0:
            left[i] = i - last_zero
            last_zero = i + 1
            zeroes.append(i)
        else:
            last_one = i

    print('left', left)
    print('right', right)

我有点能够“黑客式”地绕过去填充“left”字典,但填充“right”字典是个问题。

1
注意,在原则上,如果你有一个用于左边有效的算法,你总是可以在 nums[::-1] 上运行它以得到右边... - juanpa.arrivillaga
我更喜欢只运行一次循环。 - Christian-G
1
@Christian-G 我不理解你的字典。右边的字典不应该是 {2: 5, 5: 3, 6: 3} 吗? - miradulo
你可以使用str.split()来简化循环中的一些复杂度。 - Niayesh Isky
啊,我现在明白了,感谢你的修改。 - miradulo
2个回答

1
这里有一种你可以组织逻辑的方式。
var = str(1101100111)

idx = [i for i, j in enumerate(var) if j=='0']
counts = list(map(len, var.split('0')))

left = dict(zip(idx, counts))        # {2: 2, 5: 2, 6: 0}
right = dict(zip(idx, counts[1:]))   # {2: 2, 5: 0, 6: 3}

解释

  • 将您的序列转换为字符串;并找到'0'元素的索引。
  • 按'0'拆分,并提取每个'1'序列的长度。
  • 最后,使用dict(zip(x, y))创建左右字典。

这太棒了。str.split()做得很好。 - pylang

-2
注意到 right[zeroes[i]] == left[zeroes[i+1]],即一个零的右边的一与下一个零左边的一相等。您可以轻松生成left字典,并在zeroes上运行循环以生成right字典。
for i in range(len(zeroes)-1):
    right[zeroes[i]] = left[zeroes[i+1]]

对于最后一个零,右边的1可以由字符串末尾的尾随1给出。这可能会得到答案,但要注意一些特殊情况。
if last_one > last_zero:
    right[zeroes[-1]] = last_one - last_zero
else
    right[zeroes[-1]] = 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接