用Python

时间:2017-03-29 11:43:44

标签: python

我有这些数据(来自某些服务器的随机数据的一部分):

 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的总和,依此类推。

2 个答案:

答案 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以下的键。