我头疼,像这样的字典:
{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] =='+'])
但是我只得到一个包含两个值的列表(两个字符串开关)。 我尝试过更改'+'和'-'字符而没有成功,有什么建议吗?
答案 0 :(得分:4)
您可以做的就是使用字典理解功能来构建字典,并计算字典中每个条目的值更改多少次:
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
答案 1 :(得分:2)
您不需要过滤。只需计算分组依据:
mydict = {'a': ['+','+','-','-','+','-','-','+'],
'b': ['+','+','+','-','-','+','+','+','-'],
'c': ['-','-','-','+','+','+']}
for k,v in mydict.items():
print(k + ' ' + str(len(list(itertools.groupby(list(v))))-1))