Пока я пытаюсь создать словарь, используя 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
Насколько я понимаю, эта ошибка возникает, когда функция обновления вызывается только с одним значением (вместо пары значений ключа). Я знаю, что во вложенных вызовах функций что-то не так, но не нашел.
Как я могу получить фрагмент словаря? Есть ли способ сделать это без повторения всего словаря и обновления до нового словаря?
Затем вам нужно распаковать код и проверить возврат islice(dict(Counter(input())),3) - вероятно, это не диктат, а ключи
Как я могу получить фрагмент словаря? Есть ли способ получить нарезанный словарь без фактического перебора всего словаря и обновления до нового словаря?






Вы можете использовать islice для элементов объекта Counter (который является подклассом dict, поэтому преобразование dict не требуется), а затем преобразовать нарезанные элементы в dict с помощью конструктора dict.
Например,
dict(islice(Counter('abbcccddeeff').items(), 3))
возвращает: (обратите внимание на отсутствие d, e и f)
{'a': 1, 'b': 2, 'c': 3}
Итерация по словарю даст только ключи. Чтобы разрезать словарь, вам нужно извлечь ключ и значение через dict.items. Кроме того, обратите внимание, что collections.Counter является подклассом dict, поэтому преобразование dict не требуется.
How can I get a slice of dictionary items? Is there a way I could do this without actually iterating through the entire dictionary and updating to a new dictionary?
Нет, вы не можете разрезать словарь без итерации. Вы можете создать новый объект Counter и использовать islice для возврата первых 3 значений по порядку размещения. Это по-прежнему требует итерации и работает в 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, не соответствует внутреннему порядку, в котором хранятся элементы, которым по-прежнему является вставка заказана. См. Также Как Counter / defaultdict упорядочены в Python 3.7?Наверное, это было НЕТ. Но я видел, что в 3.7+ Counter также поддерживает порядок вставки, но его повтор не обновлялся. Согласно вашему комментарию о порядке счетчика, list(Counter('aadddassaaa')), вероятно, предоставит порядок вставки. Итак, я хотел бы сохранить Counter () как другой список, а затем разрезать список и получить доступ к каждому ключу? from collections import Counter from itertools import islice x = Counter('abbcccddeeff') c = [(i,x[i]) for i in islice(list(x),3)] print(c)
Итак, isslice ожидает итераций. Итак, чтобы разрезать словарь, вам, вероятно, следует преобразовать словарь в список кортежей. Но словарь не поддерживает порядок вставки. Итак, чтобы сохранить, что вы, вероятно, можете использовать Ordered dict из библиотеки lib в python.
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)))
Вы можете объяснить эту лямбда-функцию?
Мне понравилось ваше решение, вот мое (используя лямбду от вас: p) print([(i[0],i[1]) for i,j in zip(sorted(Counter(input()).items(),key=lambda x:(-x[1],x[0])),range(3))])
посмотрите и на это решение: from collections import Counter, OrderedDict class OrderedCounter(Counter, OrderedDict): pass [print(*c) for c in OrderedCounter(sorted(input())).most_common(3)]
But dictionary does not maintain the insertion order. Это неверно. В Python 3.6+ словари (включая Counter) находятся вставка упорядочена.
@jpp Спасибо, что поставили эту точку зрения. Да, они поддерживают порядок в версии Python 3.6+ выше. Но согласно старой реализации это не так.
Но Counter не дает порядок вставки. Я также пробовал список (Counter ()). Нет помощи. Они сохраняются, но как восстановить?
@ control-zed, см. Как Counter / defaultdict упорядочены в Python 3.7? Вам нужно указать, какую версию Python вы используете, в вашем вопросе не ясно.
(Python 2.6+) Я мог бы решить эту проблему с помощью Заказанный счетчик. Вы можете увидеть объяснение здесь: Как работает рецепт упорядоченного счетчика
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])
В Python 3.6+ упорядоченная вставка в dict может устранить этот рецепт. Counter уже можно заказать.
Это было в моем случае. Это необязательно.
isliceизdictпредоставит вам итератор по части ключей. Вы получаете сообщение об ошибке, потому что конструкторdictожидает итерацию двухэлементных итераций.