Сортировка списков словарей в словаре - PullRequest
0 голосов
/ 12 июля 2020

РЕДАКТИРОВАТЬ:
Я редактирую весь пост, потому что он не так ясен, как я думал.

У меня есть этот словарь (список словарей в словаре) и мне нужно отсортировать его по значениям "Position" и "Team", что означает, что мне нужно получить все значения из этих двух ключей и распечатать их, как показано ниже. Я знаю, как получить каждое значение, но не знаю, как их получить и отсортировать.

dic = {"Racing" : [ {"Team" : "Racing",
                     "Player" : "Player 1",
                     "Position" : "GK" },
                    {"Team" : "Racing",
                     "Player" : "Player 2",
                     "Position" : "DF"} ],
       "Independiente" : [ {"Team" : "Independiente",
                            "Player" : "Player A",
                            "Position" : "GK"},
                           {"Team" : "Independiente",
                            "Player" : "Player B",
                            "Position" : "DF"} ]
       }

Я пробовал этот фрагмент кода, но все равно не могу заставить его работать.

{k: v for k, v in sorted(dic.items(), key=lambda item: (item[1][2], item[1][0]))}

Мой настоящий словарь намного больше, чем этот, и я стараюсь сделать его еще больше. Мне нужно, чтобы результат был примерно таким:

DF - Independiente
DF - Racing
GK - Independiente
GK - Racing

В этом примере я включил только строки, но мне также нужно отсортировать похожие словари по целочисленным значениям.

Ответы [ 3 ]

0 голосов
/ 12 июля 2020

Решение, которое я нашел, - использовать вспомогательный диктант, в котором вы сохраняете команды по позициям. А затем сортируйте по команде и позиции при выводе данных. Например:

from collections import defaultdict

dic = {"Racing" : [ {"Team" : "Racing",
                     "Player" : "Player 1",
                     "Position" : "GK" },
                    {"Team" : "Racing",
                     "Player" : "Player 2",
                     "Position" : "DF"} ],
       "Independiente" : [ {"Team" : "Independiente",
                            "Player" : "Player A",
                            "Position" : "GK"},
                           {"Team" : "Independiente",
                            "Player" : "Player B",
                            "Position" : "DF"} ]
       }
       
dict = defaultdict(list)
for team in dic:
    for player in dic[team]:
        dict[player["Position"]].append(player["Team"])
for position in sorted(dict.keys()):
    for item in sorted(dict[position]):
        print(f"{position} - {item}")

вывод:

DF - Independiente
DF - Racing
GK - Independiente
GK - Racing
0 голосов
/ 12 июля 2020

Извлечь значения di c как кортеж из (Position, Team), Объедините их, чтобы создать уплощенный кортеж из (Position, Team) элементов. Сортировать их с сортировкой

dic = {"Racing" : [ {"Team" : "Racing",
                     "Player" : "Player 1",
                     "Position" : "GK" },
                    {"Team" : "Racing",
                     "Player" : "Player 2",
                     "Position" : "DF"} ],
       "Independiente" : [ {"Team" : "Independiente",
                            "Player" : "Player A",
                            "Position" : "GK"},
                           {"Team" : "Independiente",
                            "Player" : "Player B",
                            "Position" : "DF"} ]
       }

res = ()
#           emit as tuple of (Position, Team) from all of dic's values
for PT in ( tuple((team['Position'], team['Team']) for team in v) for v in dic.values() ):
    res = res + PT
    # concatenate all tuples to flatten into one large tuple
res = sorted(res)
# sort tuple of (Position, Team) values

print(res)

# create string representation in format "Position - Team\n..."
print("\n".join(" - ".join(r) for r in res))
0 голосов
/ 12 июля 2020

Я не уверен, что вы имеете в виду под «сортировкой по позиции и команде» и напишите, что вы написали для вывода.

Если вы хотите, чтобы ваш вывод был ...

DF - Independiente
DF - Racing
GK - Independiente
GK - Racing  

Тогда вы хотите это сохранить, как хотите. Может быть, в списке или в новом слове.

for i in dic.values():
    print(list(i[1].values())[2]+' - '+list(i[1].values())[0])
    print(list(i[1].values())[2]+' - '+list(i[0].values())[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...