Сортировка по одному из значений в словаре Python
Подскажите плиз как можно почистить словарь от тех данных, у которых в значение число меньше, чем у того, которое с таким же именем в значении. Для примера приведу код:
old_dict = {
1: (100, 'dima'),
2: (200, 'vova'),
3: (300, 'oleg'),
4: (400, 'vova'),
5: (500, 'sasha')
}
new_dict = {}
В new_dict должны оказаться все записи из old_dict кроме 2: (200, 'vova'), так как есть 4: (400, 'vova')
Ответы (2 шт):
Автор решения: CrazyElf
→ Ссылка
Наверное, можно как-то проще, но если в лоб решать задачу, то нужно сначала пересобрать данные в словарь с ключами-именами и списком значений, а потом можно уже найти и оставить максимальное значение и опять пересобрать словарь в исходный вид:
old_dict = {
1: (100, 'dima'),
2: (200, 'vova'),
3: (300, 'oleg'),
4: (400, 'vova'),
5: (500, 'sasha')
}
temp_dict = {}
for k1,v1 in old_dict.items():
v2,k2 = v1
temp_dict[k2] = temp_dict.get(k2, [])
temp_dict[k2].append((k1,v2))
print(temp_dict)
new_dict = {}
for k1,v1 in temp_dict.items():
k2,v2 = max(v1, key=lambda x: x[1])
new_dict[k2] = (v2,k1)
print(new_dict)
Вывод:
{
'dima': [(1, 100)],
'vova': [(2, 200), (4, 400)],
'oleg': [(3, 300)],
'sasha': [(5, 500)]
}
{
1: (100, 'dima'),
4: (400, 'vova'),
3: (300, 'oleg'),
5: (500, 'sasha')
}
Автор решения: gil9red
→ Ссылка
Собрал словарь с ключом-именем и значением индексом+значением
old_dict = {
1: (100, 'dima'),
2: (200, 'vova'),
3: (300, 'oleg'),
4: (400, 'vova'),
5: (500, 'sasha'),
6: (250, 'dima'),
7: (150, 'dima'),
8: (200, 'oleg'),
}
name_by_values = dict()
for i, (value, name) in old_dict.items():
if name not in name_by_values:
name_by_values[name] = i, value
else:
_, old_value = name_by_values[name]
if value > old_value:
name_by_values[name] = i, value
new_dict = {
i: (value, name)
for name, (i, value) in name_by_values.items()
}
print(new_dict)
# Тоже самое с сортировкой по номеру
new_sorted_dict = {
i: (value, name)
for name, (i, value) in sorted(name_by_values.items(), key=lambda x: x[1][0])
}
print(new_sorted_dict)
Результат:
{6: (250, 'dima'), 4: (400, 'vova'), 3: (300, 'oleg'), 5: (500, 'sasha')}
{3: (300, 'oleg'), 4: (400, 'vova'), 5: (500, 'sasha'), 6: (250, 'dima')}