当我尝试使用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
据我了解,此错误是由于仅使用一个值(而不是键值对)调用更新函数引起的。我知道嵌套函数调用中有不好的地方,但是找不到。
如何获得一部分词典项目?有没有一种方法可以使我不必真正遍历整个字典并更新到新字典?
答案 0 :(得分:1)
迭代字典只会产生密钥。要切片字典,您需要通过dict.items
提取键和值。另外,注意collections.Counter
是dict
的子类,因此不需要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})
需要注意的几点:
Counter
对象的打印顺序与存储项目的内部顺序不符,该顺序仍然是插入顺序。另请参见How are Counter / defaultdict ordered in Python 3.7? 答案 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))
,d
和e
)
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])