подсчет количества значений в определенном ключе для словаря Python - PullRequest
0 голосов
/ 29 июня 2018

Может ли кто-нибудь объяснить мне это и / или направить меня на правильный / питонный способ сделать это?

Python 2.7.

В конечном итоге, я пытаюсь перебрать счетчик слов D:

countsD = {"aa": None, "bb": None, "cc": None, "dd": None} 

и для совпадения в соответствующем словаре d:

d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (45, 98), "dd": (1, 33)}

добавить количество элементов в качестве значения к соответствующему соответствующему ключу, чтобы, наконец, создать это число D

{"aa": 6, "bb": 3, "cc": 2, "dd": 2}

Если я сделаю это с вышеупомянутым

> d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (45, 98), "dd": (1, 33)}

> for key in d:

>>     print(key)
>>     print(len(d[key]))

Возвращено это то, что я хочу

aa
6
cc
2
dd
2
bb
3

ОДНАКО, если одно из значений для ключа содержит только 1 значение (вполне возможно), например (см. «Cc»):

d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (45), "dd": (1, 33)}

и затем запустить то же самое для цикла, я получаю сообщение об ошибке на ключ "cc":

aa
6
cc
Traceback (most recent call last):
  File "<interactive input>", line 3, in <module>
TypeError: object of type 'int' has no len()

ОДНАКО снова, если я сделаю так, чтобы ключ "cc" имел пустое значение (), то все снова в порядке.

d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (), "dd": (1, 33)}

>>> d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (), "dd": (1, 33)}
>>> for key in d:
...     print(key)
...     print(len(d[key]))
... 
aa
6
cc
0
dd
2
bb
3

И при вводе заголовка для этого поста я только что сослался на Подсчет количества значений в словаре для каждого ключа для ответа. Отлично, одна строка! Но опять же, для ключа только с одним значением это не удается. Это хорошо:

>>> d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (), "dd": (1, 33)}
>>> new_countsD = {k: len(v) for k,v in d.items()}
>>> new_countsD
{'aa': 6, 'bb': 3, 'cc': 0, 'dd': 2}

это не так, см. Ключ "cc"

>>> d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (111), "dd": (1, 33)}
>>> new_countsD = {k: len(v) for k,v in d.items()}
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "<interactive input>", line 1, in <dictcomp>
TypeError: object of type 'int' has no len()

Итак, что дает ?? Я чувствую, что упускаю что-то глупое ...

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

В Python кортеж из одного элемента (называемый одноэлементным) записывается как (value,), поэтому (111) в ваших входных данных следует записывать как (111,); в противном случае это будет считаться целым числом 111.

Из документации tuple :

Особой проблемой является построение кортежей, содержащих 0 или 1 пункты: синтаксис имеет некоторые дополнительные причуды, чтобы приспособить их. пустой кортежи составлены из пустой пары скобок; кортеж с один элемент создается после значения через запятую (это не достаточно, чтобы заключить одно значение в скобки). Некрасиво, но эффективный.

>>> empty = ()
>>> singleton = 'hello',    # <-- note trailing comma
>>> len(empty)
0
>>> len(singleton)
1
>>> singleton
('hello',)
0 голосов
/ 29 июня 2018

Это происходит потому, что когда вы сохраняете значение типа cc только с одним значением, оно просто сохраняется как int и больше не является кортежем, что означает, что у него нет функции len(). Вы можете просто добавить проверку значения type, например:

if type(d[key]) == int:
    print(1)
else:
    print(len(d[key]))

Таким образом, вы не будете пытаться получить доступ к свойству длины int и не получите свою ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...