使用groupby对列表中的字符串开关进行计数

2024-04-25 08:27:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我头痛,字典上写着:

{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] =='+'])

但我只得到一个包含两个值(两个字符串开关)的列表。。 我尝试过改变'+'和'-'字符,但没有成功,有什么建议吗?你知道吗


Tags: 方法字符串inforlenif字典mydict
2条回答

您可以使用字典理解功能构建字典,并计算字典中每个条目的值更改的次数:

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}

或者如果你喜欢^{}

{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

你不需要过滤。数一数groupby:

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

for k,v in mydict.items():
  print(k + ' ' + str(len(list(itertools.groupby(list(v))))-1))

相关问题 更多 >