У меня есть такой список.
listt =[[' 2020-06-12 00:00:00+03:00 ',' 91.5','91.9','91.9','91.9','92.55','92.55','92.1','93.3','93.3 '],
[' 2020-06-13 00:00:00+03:00 ',' 91.6','91.6','92.85','92.85','92.85','92.85','92.3','92.3','92.1','92.1','94.1',],
[' 2020-06-14 00:00:00+03:00 ',' 91.5','91.5','91.65','91.65','91.5','92.9','92.9 '],
[' 2020-06-15 00:00:00+03:00 ',' 91.85','91.85','91.6','91.85','91.85','92.55','92.4','92.4','93.7','93.7','93.35','93.35 '],
[' 2020-06-16 00:00:00+03:00 ',' 91.6','91.6','91.3','91.3','92.75','92.75','92.15','92.15','93.15','93.15','92.9']]
Я хочу распечатать ежедневное количество уникальных измерений в порядке убывания по дате.
Мой ожидаемый результат
Я использую счетчик. Но это не делает group by.
c = collections.Counter(daily_weights)
IIUC, вам не нужен счетчик для этой задачи. Просто делать:
import pprint
from operator import itemgetter
listt = [[' 2020-06-12 00:00:00+03:00 ', ' 91.5', '91.9', '91.9', '91.9', '92.55', '92.55', '92.1', '93.3', '93.3 '],
[' 2020-06-13 00:00:00+03:00 ', ' 91.6', '91.6', '92.85', '92.85', '92.85', '92.85', '92.3', '92.3', '92.1',
'92.1', '94.1', ],
[' 2020-06-14 00:00:00+03:00 ', ' 91.5', '91.5', '91.65', '91.65', '91.5', '92.9', '92.9 '],
[' 2020-06-15 00:00:00+03:00 ', ' 91.85', '91.85', '91.6', '91.85', '91.85', '92.55', '92.4', '92.4', '93.7',
'93.7', '93.35', '93.35 '],
[' 2020-06-16 00:00:00+03:00 ', ' 91.6', '91.6', '91.3', '91.3', '92.75', '92.75', '92.15', '92.15', '93.15',
'93.15', '92.9']]
# count number of unique measurements
counts = ((head, len(set(tail))) for head, *tail in listt)
# sort the list in descending order based on the count of unique measurements
res = sorted(counts, key=itemgetter(1), reverse=True)
pprint.pprint(res)
Выход
[(' 2020-06-15 00:00:00+03:00 ', 8),
(' 2020-06-16 00:00:00+03:00 ', 7),
(' 2020-06-12 00:00:00+03:00 ', 6),
(' 2020-06-13 00:00:00+03:00 ', 6),
(' 2020-06-14 00:00:00+03:00 ', 5)]
Выражение генератора :
# count number of unique measurements
counts = ((head, len(set(tail))) for head, *tail in listt)
будет подсчитывать количество уникальных измерений в день. Затем просто отсортируйте, используя это число в порядке убывания.
# sort the list in descending order based on the count of unique measurements
res = sorted(counts, key=itemgetter(1), reverse=True)
Лучше всего использовать здесь pandas
. Он более удобочитаем, ремонтопригоден и масштабируем. Кроме того, он имеет внутреннюю поддержку даты и времени, если вы когда-либо хотели изменить формат столбца даты.
import pandas as pd
l1 =[[' 2020-06-12 00:00:00+03:00 ',' 91.5','91.9','91.9','91.9','92.55','92.55','92.1','93.3','93.3 '],
[' 2020-06-13 00:00:00+03:00 ',' 91.6','91.6','92.85','92.85','92.85','92.85','92.3','92.3','92.1','92.1','94.1',],
[' 2020-06-14 00:00:00+03:00 ',' 91.5','91.5','91.65','91.65','91.5','92.9','92.9 '],
[' 2020-06-15 00:00:00+03:00 ',' 91.85','91.85','91.6','91.85','91.85','92.55','92.4','92.4','93.7','93.7','93.35','93.35 '],
[' 2020-06-16 00:00:00+03:00 ',' 91.6','91.6','91.3','91.3','92.75','92.75','92.15','92.15','93.15','93.15','92.9']]
df = pd.DataFrame(l1)
df.columns = ["date"] + ["M{}".format(i) for i in range(1, len(df.columns))]
df = df.set_index(["date"])
res=df.nunique(axis=1)
res.sort_values(axis=0, ascending=False, inplace=True)
print(res)
вывод будет:
date
2020-06-15 00:00:00+03:00 8
2020-06-16 00:00:00+03:00 7
2020-06-13 00:00:00+03:00 6
2020-06-12 00:00:00+03:00 6
2020-06-14 00:00:00+03:00 5
dtype: int64
Использование pandas не является лучшей практикой и не более читабельно (вам нужно знать pandas для понимания решения)
Непонятно, чего вы пытаетесь достичь. Каков именно ваш ожидаемый результат?
Counter
требует, чтобы все, что вы пытаетесь посчитать, было хешируемым. Элементы списка не хэшируются. Как это обойти сложно сказать, потому что опять же непонятно, чего вы хотите