Python 在位字符串的左侧和右侧填充一个数的dict

Python 在位字符串的左侧和右侧填充一个数的dict,python,Python,我有这样一个位字符串:1101100111,我想构造一个dict,它包含任意零的左边的一个数和右边的一个数,例如: left={2:2,5:2,6:0},right={2:2,5:0,6:3} 在这些dict中,键是索引,值是个数。 因此,在索引2处,左侧有2个,右侧有2个。 在索引5处,左侧有2个,右侧有0个。 在索引6中,左侧有0个,右侧有3个 我有以下代码: left, right, zeroes = {}, {}, [] last_zero, last_one = 0,

我有这样一个位字符串:
1101100111
,我想构造一个dict,它包含任意零的左边的一个数和右边的一个数,例如:

left={2:2,5:2,6:0},right={2:2,5:0,6:3}

在这些dict中,键是索引,值是个数。 因此,在索引2处,左侧有2个,右侧有2个。 在索引5处,左侧有2个,右侧有0个。 在索引6中,左侧有0个,右侧有3个

我有以下代码:

    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)

我可以通过“黑客”来填充“左”dict,但填充“右”dict是个问题。

注意
right[zeroes[I]==left[zeroes[I+1]]
也就是说,一个零的右边的一个等于下一个零左边的一个。您可以轻松生成
left
dict,并在
zero上运行循环以生成
right
dict

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

这里有一种方法可以组织你的逻辑

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))
创建左字典和右字典
注意,原则上,如果你有一个适用于左边的算法,你可以在
nums[:-1]
上运行它来获得右边的结果……我更喜欢运行循环once@Christian-我不明白你的口述。正确的dict不应该是
{2:5,5:3,6:3}
?您可以使用
str.split()
,这可能会减少循环中的一些复杂性。啊,我现在明白了,谢谢您的编辑。这太棒了。这太棒了。
str.split()
做得对。