按嵌套值

时间:2016-04-30 00:08:41

标签: python dictionary hashtable

我有一个由大量的csv制作的list。 对于list中的每个项目,我已将其分解为iddetailsid最大长度在0到3个字符之间,details是可变的。 我创建了一个空字典,D ...(下面的其余代码):

D={}

for v in list:

    id = v[0:3]
    details = v[3:]

    if id not in D:
        D[id] = {}

    if details not in D[id]:
        D[id][details] = 0

    D[id][details] += 1

除此之外:你能帮我理解这两个if陈述在做什么吗? 对python和编程很新。

无论如何,它产生这样的东西:

{'KEY1_1': {'key2_1' : value2_1, 'key2_2' : value2_2, 'key2_3' : value2_3},
'KEY1_2': {'key2_1' : value2_1, 'key2_2' : value2_2, 'key2_3' : value2_3},
and many more KEY1's with variable numbers of key2's

每个' KEY1'是独特的,但每个键2'不一定是。 value2_ s都不同。

好的,现在我找到了按第一个KEY排序的方法

for k, v in sorted(D.items()):
    print k, ':', v

我已经做了足够的研究,知道字典无法真正排序,但我不关心排序,我关心排序或更具体的发生频率。在我的代码value2_x中,该特定key2_x的对应KEY1_x的出现次数。我开始认为我应该使用更好的变量名。

问题:如何按嵌套词典中value2_x中的数字订购顶级/整体词典?我想对像......这样的数字做一些统计。

  1. 最常见的KEY1_x:key2_x对出现多少次?
  2. 最常见的10,20,30个KEY1_x:key2_x对是什么?
  3. 我是否只能按每个KEY1执行此操作,还是可以整体执行此操作?额外奖励:如果我可以通过这种方式进行演示/分享,那将非常有用,因为它是如此庞大的数据集。非常感谢提前,我希望我已经提出了我的问题和意图。

1 个答案:

答案 0 :(得分:0)

您可以使用Counter根据频率对密钥对进行排序。它还提供了一种简单的方法来获取x最常用的项目:

from collections import Counter

d = {
    'KEY1': {
        'key2_1': 5,
        'key2_2': 1,
        'key2_3': 3
    },
    'KEY2': {
        'key2_1': 2,
        'key2_2': 3,
        'key2_3': 4
    }
}

c = Counter()
for k, v in d.iteritems():
    c.update({(k, k1): v1 for k1, v1 in v.iteritems()})

print c.most_common(3)

输出:

[(('KEY1', 'key2_1'), 5), (('KEY2', 'key2_3'), 4), (('KEY2', 'key2_2'), 3)]

如果你只关心最常见的密钥对而没有其他理由来构建嵌套字典,你可以使用以下代码:

from collections import Counter

l = ['foobar', 'foofoo', 'foobar', 'barfoo']
D = Counter((v[:3], v[3:]) for v in l)
print D.most_common() # [(('foo', 'bar'), 2), (('foo', 'foo'), 1), (('bar', 'foo'), 1)]

简短说明((v[:3], v[3:]) for v in l)generator expression,会生成tuples,其中第一项与原始{{1}中的顶级键相同第二项与嵌套dict中的键相同。

dict

>>> x = list((v[:3], v[3:]) for v in l) >>> x [('foo', 'bar'), ('foo', 'foo'), ('foo', 'bar'), ('bar', 'foo')] Counter的子类。它接受dict作为参数,iterable中的每个唯一元素将用作键,值是iterable中元素的数量。

iterable

由于>>> c = Counter(x) >>> c Counter({('foo', 'bar'): 2, ('foo', 'foo'): 1, ('bar', 'foo'): 1}) is an iterable,因此无需将其转换为列表,因此可以使用generator expression完成构建。

您询问的Counter((v[:3], v[3:]) for v in l)语句正在检查if中是否存在密钥:

dict

因此,以下代码将检查dict >>> d = {1: 'foo'} >>> 1 in d True >>> 2 in d False 中是否存在值为id的密钥,如果不存在,则会在那里分配空字典。

D

第二个if id not in D: D[id] = {} 对嵌套词典完全相同。