python - 使用 groupby 计算列表中的字符串开关

标签 python string python-itertools

我头疼,字典是这样的:

{a: ['+','+','-','-','+','-','-','+'],
b: ['+','+','+','-','-','+','+','+','-'],
c: ['-','-','-','+','+','+']}

我想知道值字符串更改了多少次,如下所示:

a = 4
b = 3
c = 1

我尝试使用 itertools 中的 groupby,方法是:

for k, v in mydict.iteritems():
    print k + ' ' + str([len(list(g[1])) for g in groupby(list(v)) if g[0] =='+'])

但我只得到一个包含两个值的列表(两个字符串开关).. 我尝试更改“+”和“-”字符但没有成功,有什么建议吗?

最佳答案

您可以做的是使用字典推导式构建字典,并计算字典中每个条目中的值更改了多少次:

d = {'a': ['+','+','-','-','+','-','-','+'], 'b': ['+','+','+','-','-','+','+','+','-'], 
     'c': ['-','-','-','+','+','+']}

s = {k : sum(1 for i,j in zip(d[k][1:], d[k][:-1]) if i != j) for k in d}
# {'a': 4, 'b': 3, 'c': 1}

或者如果你喜欢 itertools.groupby :

{k : sum(1 for i in groupby(d[k]))-1 for k in d}
# {'a': 4, 'b': 3, 'c': 1}

详情

为了检测每个列表中元素的变化,您可以将其元素与列表的滞后版本进行比较,这可以通过压缩列表的两个切片来完成,zip(d[k] [1:], d[k][:-1]).

例如,对于键 a:

list(zip(d['a'][1:], d['a'][:-1]))
# [('+', '+'), ('-', '+'), ('-', '-'), ('+', '-'), ('-', '+'), ('-', '-'), ('+', '-')]

现在只需使用生成器表达式并在每次元组中的值不同时添加 1:

sum(1 for i,j in zip(d['a'][1:], d['a'][:-1]) if i != j)
# 4

关于python - 使用 groupby 计算列表中的字符串开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55244975/

相关文章:

python - 如何在 python 3 中为字节对象实现 sprintf 样式格式?

Python For 循环语法

c++ - 用 C++ 为非英语语言打印字符串

Python 3,模块 'itertools' 没有属性 'ifilter'

python - QTreeView 数据更改信号/插槽实现?

python - n[::-1] 在 Python 中是什么意思?

swift - 如何使用 gzip 将从蓝牙低功耗设备获取的压缩 .gz 文件转换为 Swift 4.2 中的实际解压缩文件?

python - itertools 库中的 tee 函数

python - 想要将列表的每个元素与 n 个列表的每个元素组合

python - 将 int 变量转换为使用 str 函数时 str 对象不可调用