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

{'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

Может кто поможет?

2
abutremutante 15 Дек 2015 в 18:12

4 ответа

Лучший ответ

То же, что и Kasramvd, но отсортировано по дате.

zip(*(dct[i] for i in sorted(dct)))
3
pacholik 16 Дек 2015 в 08:39

Вам не нужно это ввинчивать вот так: просто используйте 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')]
2
Kasramvd 15 Дек 2015 в 15:41

К сожалению, я не смог заставить эти прекрасные решения работать (я новичок в 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
0
abutremutante 16 Дек 2015 в 15:06

Редактировать: я думаю, что это по сути то же самое, что и @ pacholik's. Он вошел туда первым.

[list(z) for z in zip(*[d[key] for key in sorted(d.keys(), reverse=True)])]
0
Ogaday 16 Дек 2015 в 02:03