Фрагмент словаря, являющийся результатом коллекций

Пока я пытаюсь создать словарь, используя 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 предоставит вам итератор по части ключей. Вы получаете сообщение об ошибке, потому что конструктор dict ожидает итерацию двухэлементных итераций.

timgeb 04.10.2018 10:42

Затем вам нужно распаковать код и проверить возврат islice(dict(Counter(input())),3) - вероятно, это не диктат, а ключи

576i 04.10.2018 10:43

Как я могу получить фрагмент словаря? Есть ли способ получить нарезанный словарь без фактического перебора всего словаря и обновления до нового словаря?

control-zed 04.10.2018 10:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
1 210
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать 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})

Несколько замечаний:

  1. Порядок, в котором печатаются объекты Counter, не соответствует внутреннему порядку, в котором хранятся элементы, которым по-прежнему является вставка заказана. См. Также Как Counter / defaultdict упорядочены в Python 3.7?
  2. Вы можете спросить, почему, если словари заказаны, как в Python 3.6+, вы напрямую разрезаете не мочь. Есть структурные причины, по которым это невозможно: см. Доступ к элементам словаря позиция в Python 3.6+ эффективно.

Наверное, это было НЕТ. Но я видел, что в 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)

control-zed 05.10.2018 07:59

Итак, 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)))

Вы можете объяснить эту лямбда-функцию?

control-zed 05.10.2018 08:17

Мне понравилось ваше решение, вот мое (используя лямбду от вас: p) print([(i[0],i[1]) for i,j in zip(sorted(Counter(input()).items(),key=lambda x:(-x[1],x[0])),range(3))])

control-zed 05.10.2018 08:45

посмотрите и на это решение: from collections import Counter, OrderedDict class OrderedCounter(Counter, OrderedDict): pass [print(*c) for c in OrderedCounter(sorted(input())).most_common(3)]

control-zed 05.10.2018 08:47
But dictionary does not maintain the insertion order. Это неверно. В Python 3.6+ словари (включая Counter) находятся вставка упорядочена.
jpp 05.10.2018 10:17

@jpp Спасибо, что поставили эту точку зрения. Да, они поддерживают порядок в версии Python 3.6+ выше. Но согласно старой реализации это не так.

Rohith Rangaraju 05.10.2018 10:26

Но Counter не дает порядок вставки. Я также пробовал список (Counter ()). Нет помощи. Они сохраняются, но как восстановить?

control-zed 05.10.2018 10:27

@ control-zed, см. Как Counter / defaultdict упорядочены в Python 3.7? Вам нужно указать, какую версию Python вы используете, в вашем вопросе не ясно.

jpp 05.10.2018 10:33

(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 уже можно заказать.

pylang 08.10.2018 21:41

Это было в моем случае. Это необязательно.

control-zed 10.10.2018 10:25

Другие вопросы по теме