我有这些数据(来自某些服务器的随机数据的一部分):
data={2: [9, ['b', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']], 3: [9,
['c', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']], 5: [5, ['c', 'b', 'a',
'b', 'b']], 7: [9, ['c', 'c', 'a', 'b', 'a', 'b', 'a', 'b', 'a']]}
在此数据中,第一个数字是键,第二个值是后面括号中的条目数。例如:- 对于数据
2:[9,[' b',' b',' a',' b',' a& #39;,' b',' a',' b',' a']]
2是关键。 9是其后面括号中的条目总数。
此外,对于具有小于9的第二值的键将被丢弃。 我得到了data.values()可以给我值
[[9,[' b',' b',' a',' b',' a&# 39;,' b',' a',' b',' a']],[9,[' c& #39 ;, ' b',' a',''' a',' b',' a& #39;,' b',' a']],[5,[' c',' b',' a',' b', ' b']],[9,[' c',' c',' a'' b' ,'''' a''''' a']]}
但我无法找到在矩阵中索引的任何方法。
我需要根据以下数据制作矩阵:
a b c
2 4 5 0
3 4 4 1
7 4 3 2
矩阵值[1] [1]是键值2中的a的总和,[1] [2]是键值2和[1]中b的总和[ 3]是键值2中c的总和,[2] [1]是键值3中的a的总和,依此类推。
答案 0 :(得分:2)
您可以使用Collections.Counter
:
来自集合导入计数器
data = {
2: [9, ['b', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']],
3: [9, ['c', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']],
5: [5, ['c', 'b', 'a', 'b', 'b']],
7: [9, ['c', 'c', 'a', 'b', 'a', 'b', 'a', 'b', 'a']]}
matrix = {k: Counter(v[1]) for k, v in data.iteritems() if v[0] >= 9}
matrix
的价值现在是:
{
2: Counter({'b': 5, 'a': 4}),
3: Counter({'a': 4, 'b': 4, 'c': 1}),
7: Counter({'a': 4, 'b': 3, 'c': 2})
}
访问矩阵的成员可以按如下方式进行:
matrix[2].get('a', 0)
(注意:使用dict.get
是默认返回0
,表示没有出现,因此未在Counter
对象中创建密钥
哪个会给出价值:
4
答案 1 :(得分:1)
可能Reut Sharabani的答案更好更快,但我会这样做:
data = {
2: [9, ['b', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']],
3: [9, ['c', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a']],
5: [5, ['c', 'b', 'a', 'b', 'b']],
7: [9, ['c', 'c', 'a', 'b', 'a', 'b', 'a', 'b', 'a']]
}
matrix = {key: {k: val[1].count(k) for k in set(val[1])} for key, val in data.iteritems() if val[0] >=9}
哪个会给你:
{2: {'a': 4, 'b': 5},
3: {'a': 4, 'b': 4, 'c': 1},
5: {'a': 1, 'b': 3, 'c': 1},
7: {'a': 4, 'b': 3, 'c': 2}}
当然,使用.get('c', 0)
,因此对于0的值,你得到0。
*编辑以适应原始问题,必须丢弃9以下的键。