由collections.Counter生成的字典切片

时间:2018-10-04 08:39:42

标签: python dictionary collections counter itertools

当我尝试使用dict(x)创建字典时,其中x是另一个字典的切片,d(y),其中y是collections.Counter()对象。这是单线的:

lengths=dict(islice(dict(Counter(input())),3))

我得到的例外是这个

lengths=dict(islice(dict(Counter(input())),3))
ValueError: dictionary update sequence element #0 has length 1; 2 is required

据我了解,此错误是由于仅使用一个值(而不是键值对)调用更新函数引起的。我知道嵌套函数调用中有不好的地方,但是找不到。

如何获得一部分词典项目?有没有一种方法可以使我不必真正遍历整个字典并更新到新字典?

4 个答案:

答案 0 :(得分:1)

迭代字典只会产生密钥。要切片字典,您需要通过dict.items提取键和值。另外,注意collections.Counterdict的子类,因此不需要dict转换。

  

如何获得一部分词典项目?有办法吗   这实际上并没有遍历整个字典,   更新到新词典?

否,没有迭代就无法对词典进行切片。您可以创建一个新的Counter对象,并使用islice按插入顺序返回前三个值 。这仍然需要迭代,并且可以在按字典顺序插入字典的Python 3.6+中使用。

from collections import Counter
from itertools import islice

c = Counter('abbcccddeeff')

lengths = Counter()
lengths.update(dict(islice(c.items(), 3)))

print(lengths)

Counter({'c': 3, 'b': 2, 'a': 1})

需要注意的几点:

  1. Counter对象的打印顺序与存储项目的内部顺序不符,该顺序仍然是插入顺序。另请参见How are Counter / defaultdict ordered in Python 3.7?
  2. 您可能想知道为什么要订购字典,原因是 在Python 3.6及更高版本中,您不能直接切片。有结构 无法做到这一点的原因:请参见Accessing dictionary items by position in Python 3.6+ efficiently

答案 1 :(得分:0)

您可以在public function get_empdept() { $this->db->select('ed.empdeptid,e.empname,d.deptfname'); $this->db->from('empdept ed,empinfo e,deptinfo d'); $this->db->where('e.empid =ed.empid and d.deptid = ed.deptid'); $query = $this->db->get(); return $query->result(); } (这是一个dict子类,因此不需要dict转换)对象的项目上使用islice,然后使用dict构造函数将切片的项目转换为dict。 / p>

例如,

Counter

返回:(请注意,缺少dict(islice(Counter('abbcccddeeff').items(), 3)) de

f

答案 2 :(得分:0)

所以isslice期望有一个可迭代的对象。因此,要对字典进行切片,您可能应该将字典转换为元组列表。但是字典不维护插入顺序。因此,为了保持这一点,您可以使用python集合库中的Ordered dict。

    from collections import Counter, OrderedDict
    from itertools import islice

    data = OrderedDict(list(islice(sorted(Counter("aaabbbccccddddd").items(),key=lambda element: (-element[1], element[0])), 3)))

答案 3 :(得分:-1)

(Python 2.6+),我可以使用OrderedCounter解决此问题。您可以在此处查看其解释:How Ordered Counter recipe works

from collections import Counter, OrderedDict


class OrderedCounter(Counter, OrderedDict):
    pass

dict([c for c in OrderedCounter(sorted(input())).most_common(3)])

此外,most_common(n)是collections.Counter类的一种方法,该类返回该字典中的前n个元素。参考:most_common([n])