У меня есть следующий словарь:
{'2007-10-21': ('32', '10', '78', '69'), '2007-10-28': ('32', '10', '79', '78'), '2011-07-10': ('62', '46', '67', '54')...}
Я хочу создать функцию для правильной сортировки по дате (словарные ключи), а затем разделить элементы кортежей в разных списках, объединяя каждый индекс кортежей в одном и том же списке (все первые элементы в одном списке, все вторые элементы в другом списке и т. д.). Обратите внимание, что количество списков должно быть одинаковым количеством элементов кортежей, а количество элементов списка должно иметь одинаковое количество кортежей в пределах dict. В приведенном выше примере у меня были бы следующие правильно отсортированные списки:
List 1: [32,32,62]
List 2: [10,10,46]
List 3: [78,79,67]
List 4: [69,78,54]
Я использую код, который прибивает его для первого списка, однако он не создает следующие списки, как вы можете видеть ниже:
def dict2manylists(*dicts):
"""
Receives dictionaries with tuples as values and turns it into different lists correctly sorted
:param dic: dictionaries with many different values grouped in touples
:return: different lists correctly sorted
"""
for i in dicts:
sorted_dict=sorted(i.items())
list=[]
for y in range(len(sorted_dict)):
x=0
list.append(sorted_dict[y][1][x])
x+=1
print list
Может кто поможет?
4 ответа
То же, что и Kasramvd, но отсортировано по дате.
zip(*(dct[i] for i in sorted(dct)))
Вам не нужно это ввинчивать вот так: просто используйте dict.values()
для доступа к значениям dict и zip
для получения столбцов, а затем вы можете использовать понимание списка для циклического перемещения по столбцам и сортировки их:
>>> d = {'2007-10-21': ('32', '10', '78', '69'), '2007-10-28': ('32', '10', '79', '78'), '2011-07-10': ('62', '46', '67', '54')}
>>> [sorted(x,reverse=True) for x in zip(*d.values())]
[['62', '32', '32'],
['46', '10', '10'],
['79', '78', '67'],
['78', '69', '54']]
Если вы хотите отсортировать на основе даты, вы можете преобразовать строковую дату в datetime, используя функцию datetime.strptime()
, и отсортировать элементы dict на основе этого поля, а затем использовать zip для получения столбцов:
>>> from datetime import datetime
>>> zip(*[j for i,j in sorted(d.items(),key = lambda x:datetime.strptime(x[0],'%Y-%m-%d'))])
[('32', '32', '62'), ('10', '10', '46'), ('78', '79', '67'), ('69', '78', '54')]
К сожалению, я не смог заставить эти прекрасные решения работать (я новичок в Python, и по некоторым причинам это не сработало для меня, но я уверен, что они хорошие и функциональные).
Я нашел способ получить то, что я хочу. Конечно, это не самое элегантное решение, но оно сработало:
for i in dicts:
sorted_dict=sorted(i.items())
for item in range(len(sorted_dict[1][1])):
list=[]
for y in range(len(sorted_dict)):
list.append(sorted_dict[y][1][item])
print list
Редактировать: я думаю, что это по сути то же самое, что и @ pacholik's. Он вошел туда первым.
[list(z) for z in zip(*[d[key] for key in sorted(d.keys(), reverse=True)])]
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.