下面是我想要解决的问题:
给出了一个字典,它的键是二进制字符串,值是数字,例如:
result = {'000': 25, '010': 34, '100':22, '101':35}
,我的目标是首先用相同数量的“位翻转”对键进行排序,然后将相关的值相加,然后根据翻转的数量按升序返回它们。例如,在本例中,所需的输出可以是[25,22,69]
(0、1和2个翻转)。
我的代码的第一部分是将字符串转换为位翻转的数量:
def count_flip(string):
return len([x for x in range(1, len(string)) if string[x] != string[x-1]])
我停留在第二部分,即在字典输入(如result
)的情况下,返回指定顺序的值。我的想法是遍历输入字典中的所有键,但我真的不知道如何使用相同数量的翻转来吸收字符串(键),并应用count_flip(string)
发布于 2021-12-09 23:16:30
collections.Counter
应该能帮上忙。
from collections import Counter
flip_counts = Counter()
for binary_string, value in result.items():
flip_counts[count_flip(binary_string)] += value
output = [v for _, v in sorted(flip_counts.items())]
发布于 2021-12-09 23:34:55
您可以为此使用collections.defaultdict
:
counts = defaultdict(int)
for k, v in result.items():
counts[count_flip(k)] += v
因为元组的排序是词典编纂的,所以您可以这样做。
counts = sorted(counts.items())
提取第二个元素可以通过理解完成:
[c[1] for c in counts]
或者用转座子:
list(zip(*counts))[1]
从python 3.6开始,字典就会根据插入顺序自动排序,因此您可以通过预先填充键来简化这一工作:
counts = dict.fromkeys(sorted(set(map(count_flip, result))), 0)
for k, v in result.items():
counts[count_flip(k)] += v
这样,结果就是
list(counts.values())
对于早期版本的python,您可以使用collections.OrderedDict
实现同样的效果。
https://stackoverflow.com/questions/70300827
复制