2016-11-27 4 views
-1

Если у меня есть словарь и он отсортирован, и я хочу удалить из него три элемента (по порядку величины) по индексу (независимо от содержимого исходного словаря), что мне делать? Как я могу это сделать? Я надеялся, что это позволит мне просто нарезать (например, со списками), но мне стало известно, что это невозможно.Удаление элементов определенного индекса из словаря?

EDIT: По индексу я имею в виду индексы. Например, если бы я удалил элементы с 1 по 3 из отсортированного словаря ниже, после того как он был отсортирован по значению, тогда мне оставалось бы только «яйца». РЕДАКТИРОВАТЬ 2: Как найти ключи в этих местах (в индексах 0, 1, 2)? EDIT 3: мне не разрешено импортировать или печатать в этом.

Например:

>>>food = {"ham":12, "cookie":5, "eggs":16, "steak":2} 
>>>remove_3(food) 
{"eggs":16} 
+0

Что вы подразумеваете под индексом? Вы имеете в виду под ключи? – ettanany

+0

Порядок сортировки словаря не является стабильным (изменения между различными запусками Python). Вы хотите использовать OrderedDict, который обеспечивает стабильный порядок сортировки в том порядке, в котором ключи добавляются. –

+6

Словари не заказываются и поэтому не имеют «первых трех» предметов. Поэтому вам нужно найти ключ, чтобы удалить себя. –

ответ

1

Получить ключевые пары значений (.items()), отсортировать их по значению (item[1]), и принять первые 3 ([:3]):

for key, value in sorted(food.items(), key=lambda item: item[1])[:3]: 
    del food[key] 
+0

@ AndyHayden 'sorted' создаст конкретный список отдельно от словаря. –

+0

Он все еще дает мне сообщение об ошибке :(Что мне делать? – Jen

+0

@KarolyHorvath Это O (n), когда он должен быть O (1), если бы мы использовали лучшую структуру данных. –

0

Попробуйте следующее:

import operator 
from collections import OrderedDict 


food = {"ham": 12, "cookie": 5, "eggs": 16, "steak": 2} 
ordered_dict = OrderedDict(sorted(food.items(), key=operator.itemgetter(1))) 

for key in list(ordered_dict)[:3]: 
    del ordered_dict[key] 

Выход:

>>> ordered_dict 
OrderedDict([('eggs', 16)]) 
0

Во-первых, по поводу вашего заявления:

Если у меня есть словарь и отсортирован

dict в Python не упорядочены в природе. Следовательно, вы не можете сохранить заказ. Если вы хотите создать dict с отсортированным заказом, используйте collections.OrderedDict(). Например:

>>> from collections import OrderedDict 
>>> from operator import itemgetter 

>>> food = {"ham":12, "cookie":5, "eggs":16, "steak":2} 

>>> my_ordered_dict = OrderedDict(sorted(food.items(), key=itemgetter(1))) 

трюм значение по my_ordered_dict будет:

>>> my_ordered_dict 
OrderedDict([('steak', 2), ('cookie', 5), ('ham', 12), ('eggs', 16)]) 

что эквивалентно dict с сохранением порядка, как:

{ 
    'steak': 2, 
    'cookie': 5, 
    'ham': 12, 
    'eggs': 16 
} 

Для того, чтобы преобразовать dict за исключением пунктов с верхним значением 3, вам нужно нарезать предметы (dict.items() возвращает список кортежей в форме (key, value)):

>>> dict(my_ordered_dict.items()[3:]) # OR, OrderedDict(my_ordered_dict.items()[3:]) 
{'eggs': 16}       # for maintaining the order 
Смежные вопросы