список (словарь) против dictionary.keys() против list(dictionary.keys()) в python

#python #dictionary

#python #словарь

Вопрос:

Учитывая словарь my_dict, мы применяем list(my_dict) и my_dict.keys() в следующем коде

 my_dict = {'1': 1, '2': 2, '3': 3, '4': 4}
list_keys = list(my_dict)
view_keys = my_dict.keys()
list_from_view = list(my_dict.keys())
print("list_keys : ", list_keys)
print("view_keys : ", view_keys)
print("list_from_view", list_from_view)
 

Результаты:

 list_keys :  ['1', '2', '3', '4']
view_keys :  dict_keys(['1', '2', '3', '4'])
list_from_view ['1', '2', '3', '4']
 

В чем разница между использованием list(my_dict), my_dict.keys() и list(my_dict.keys()), особенно:

  1. список (my_dict) против my_dict.keys()
  2. список (my_dict) против списка (my_dict.keys()) (каков наилучший (быстрый) способ получить список ключей)

Спасибо.

Комментарии:

1. Еще один на ваш вопрос: [k for k in my_dict] . my_dict.keys() возвращает DictKeys, а не список.

2. «каков наилучший (быстрый) способ получить список ключей» — вы можете измерить это

3. Разница во всех них была бы незначительной. Обычно я использую dict.keys()

Ответ №1:

Список Python является итерируемым, но не все итерации являются списком…

Давайте рассмотрим ваши выражения:

  1. list_keys = list(my_dict) : здесь вы используете my_dict в качестве перебора ключи и создаете из них новый список. Короче говоря, вы скопировали ключи в список. С этого момента вы можете применять любые изменения к списку или исходному dict, ничего не меняя в другом объекте
  2. view_keys = my_dict.keys() : здесь вы получаете dict_keys представление о словаре. Это немодифицируемый итерируемый объект, который можно использовать для доступа к ключам словаря. Если вы добавите элемент в словарь, вы сразу увидите его в представлении, но вы не можете ни добавить новый элемент view_keys , ни изменить или удалить его
  3. list_from_view = list(my_dict.keys()) : здесь вы получаете доступ к представлению ключей и повторяете его для создания списка. В конце концов, это точно так же, как и первый способ: вы получаете независимый список

Какой из них лучше? Это зависит.

Как я уже говорил, 1 и 3 дают эквивалентные списки. 1, вероятно, более питонический, потому что он использует тот факт, что словарь Python неявно является итеративным по своим ключам. 3, вероятно, легче понять для новых пользователей Python, поскольку он явно ссылается на операцию с ключами.

2 — это совершенно другое животное, потому что вместо независимого объекта list у вас есть представление исходного словаря, который будет следить за его изменениями.

Теперь вопрос:

каков наилучший (быстрый) способ получить список ключей

2 не вернет список ключей, потому что в списке есть append или remove методы, которых нет в представлении

1 и 3 следует рассматривать как эквивалентные с точки зрения производительности, и я уже говорил о удобочитаемости, которая является наиболее важным качеством кода Python

Вопрос, который вы должны были задать:

какой более питонический способ перебора списка ключей словаря?

Без сомнения for key in my_dict . Нет необходимости преобразовывать это в список, и представление редко требуется

Ответ №2:

Основное различие в них заключается в двух типах, а именно list и dict_keys .

list принимает все значения из заданных ключей одновременно и сохраняет их в list объекте.

dict_keys объект, с другой стороны, предоставляет вам представление о ключах словаря.

Разница между ними показана в следующем:

 d = {1: 2, 3: 4}
a = d.keys()
b = list(d)

a
# dict_keys([1, 3])

b
# [1, 3]

d[5] = 6

a
# dict_keys([1, 3, 5])

b
# [1, 3]
 

В заключение dict_keys object покажет вам ваши обновления dict , как только они будут введены, при list этом они останутся неизменными.

Если вы внесете изменения в list эти изменения, они не будут отражены dict , в то время как, с другой стороны, вы не можете вносить изменения dict_keys .

Комментарии:

1. Большое вам спасибо, этот ответ предназначен для (1. list(my_dict) против my_dict.keys()), а как насчет 2. list(my_dict) против list(my_dict.keys()) ?

2. @ibra Вы можете использовать timeit для проверки, но обычно list(my_dict) кажется, что это быстрее.