Подсчет количества значений во вложенных списках внутри словаря - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующий словарь:

d= {
'2018-01-01': [[1.0],        [2.0],        [3.0]],
'2018-01-02': [[4.0],        [5.0],        [6.0]],
'2018-01-03': [[7.0],        [8.0],        [9.0]],
'2018-01-04': [[10.0],       [11.0],       [12.0]],
'2018-01-31': [[13.0, 14.0], [15.0, 16.0], [17.0]]
}

Моя цель - подсчитать количество значений (в данном случае с плавающей запятой), предполагая, что некоторые из этих «ячеек» могут содержать более одного значения (например:значения для '2018-01-31').Другими словами, мне нужно:

result=17

До сих пор мне удавалось подсчитать количество «ячеек» (подсписков), но я не могу выяснить, как я могу посчитать несколько значений внутри одного«клетка».Я пробовал:

cols=len(d[[k for k in d.keys() if d[k]==max(d.values(),key=len)][0]])
cells = [[1 for j in range(cols)] for i in range(len(d))]
result = len([item for sublist in cells for item in sublist])

print(str(result))

Вывод:

15

Большое спасибо заранее.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018
>>> len([c for a in d.values() for b in a for c in b])
17

вам действительно стоит попробовать их в интерактивном переводчике, начать с самого простого [x for x in d.values()] и продолжить свой путь.

0 голосов
/ 11 мая 2018

Вам не нужно создавать плоский список для этой задачи. Это один из способов:

from itertools import chain

res = sum(1 for _ in chain.from_iterable(map(chain.from_iterable, d.values())))

Мы имеем дело с вложенными списками, дважды применяя chain.from_iterable и подсчитывая результаты после этого процесса.

0 голосов
/ 11 мая 2018

Вариант 1
100% выравнивание + len

>>> len([k for i in d.values() for j in i for k in j])
17

Вариант 2
sum + len + частичное выравнивание
Используйте sum с пониманием генератора. Форма с 3 списками:

>>> sum(len([*a, *b, *c]) for (a, b, c) in d.values())
17

Для общего решения (с более / менее 3 подсписками) используйте itertools.chain:

>>> from itertools import chain
>>> sum(len(list(chain.from_iterable(v))) for v in d.values())
17
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...