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()
做得对。