Для списка я могу разделить его одной компактной строкой кода:
i_ate = ['apple', 'beetroot', 'cinnamon', 'donut']
# Elaborate
first = i_ate[0]
rest = [item for j, item in enumerate(i_ate) if j != 0]
# Shortcut
first, *rest = i_ate
# Result in both cases:
first # 'apple'
rest # ['beetroot', 'cinnamon', 'donut']
Существует ли нечто подобное для словарей?
i_ate = {'apple': 2, 'beetroot': 0, 'cinnamon': 3, 'donut': 8}
# Elaborate
apples = i_ate['apple']
rest = {k: v for k, v in i_ate.items() if k != 'apple'}
# Shortcut??
# -- Your line of code here --
# Result in both cases:
apples # 2
rest # {'beetroot': 0, 'cinnamon': 3, 'donut': 8}
Я не совсем уверен, где вы видите потенциал или даже необходимость улучшения в примере со словарем. Ваш список "упрощение" выглядит лучше из-за того, что он начинается с чрезмерно сложного перечисления-выражения, которое можно отбросить.
Как насчет распаковки dict как элементов? Это будет работать на любой версии Python, которая поддерживает упорядоченные словари.
>>> _, *rest = i_ate.items()
>>> dict(rest)
{'beetroot': 0, 'cinnamon': 3, 'donut': 8}
Как подсказал ленивец в комментариях, если first_value
тоже нужен, то первый предмет можно дополнительно распаковать:
>>> (_, first_val), *rest = i_ate.items()
>>> first_val
2
.items() преобразует словарь в последовательность кортежей
Кроме того, просто удалите запись, которую вы не хотите использовать, используя del i_ate['apple']
или i_ate.pop('apple')
.
или также извлечь первое значение, как в предложенном ОП результате: (_, first_val), *rest_items = i_ate.items()
. Тогда first_val
равно 2.
@slothrop хорошая отсылка, спасибо! добавлено к ответу с кредитом
реквизит для хорошо описанного вопроса с примерами и попыткой кода