以下是我正在处理的部分代码:
def count_flip(string, init = '0'):
x0 = init + string
return sum(x != y for x, y in zip(x0, x0[1:]))
def absorb_counts(results):
flip_counts = Counter()
for binary_string, value in results.items():
flip_counts[count_flip(binary_string)] += value
return [v for _, v in sorted(flip_counts.items())]
absorb_counts
的输入results
是一个字典,其键是二进制字符串,值是一些整数。此函数将键中具有相同"flip"的所有值组合在一起,并在输出中按升序对它们进行排序。例如:
>>> test = {'011': 11, '111': 11, '110': 13, '100': 31, '001': 9, '000': 738, '010': 118, '101': 93}
>>> absorb_counts(test)
[738, 31, 162, 93]
这四个数字是738(0翻转(、31(1翻转(等。(前面有一个额外的'0'
,由count_flip
给出。(
问题:有时我的输入results
没有所有可能的二进制字符串。在这种情况下,输出是一个缺少位置的精简列表。例如:
>>> test_1 = { '110': 13, '100': 31, '000': 738, '010': 118, '101': 93}
>>> absorb_counts(test_1)
[738, 162, 93]
如何在这样的位置上"填充"零?在这种情况下,输出将是[738, 0, 162, 93]
。
在开始累积计数之前,您可以遍历range(int(max(results), base=2))
并初始化所有相应的键。如果你这样做,你甚至不需要Counter
,因为你从零开始:
def absorb_counts(results):
flip_counts = {
count_flip(bin(i)[2:]): 0
for i in range(int(max(results), base=2))
}
for binary_string, value in results.items():
flip_counts[count_flip(binary_string)] += value
return [v for _, v in sorted(flip_counts.items())]