Почему понимание словаря показывает разные значения

#python #python-3.x #dictionary #list-comprehension

#python #python-3.x #словарь #список-понимание

Вопрос:

Я хочу применить понимание словаря к заголовку и разнице в дате публикации и дате изменения.

 def vid(videos):
     diff_date = [(x.trending_date - x.publish_date).days for x in videos]
     dct = {x.title : (x.trending_date - x.publish_date).days for x in videos}

     print(diff_date)
     print(dct)
  

Часть выходных данных diff_date дает:

 [1, 1, 2, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 2361, 1, 8, 4, 2, 2, 207, 2, 1, 2, 1, 1, 2, 1, 3, 3, 2, 1, 4, 1, 4, 3, 2, 3, 4, 3, 4, 3, 2, 1, 3, 3, 1, 4, 4, 2, 4, 3, 4, 1, 4, 5, 3, 4, 3, 4, 4, 4, 4, 4, 28, 3, 4, 4, 2, 3, 3, 5, 5, 3, 4, 2, 4, 2, 5, 5, 4, 4, 4, 5, 4, 5, 5, 4, 5, 4, 4, 4, 4, 5, 4, 4, 4, 5, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 4, 4, 4, 5, 5, 6, 5, 4, 5, 4,....
  

Часть выходных dct данных дает:

 {'WE WANT TO TALK ABOUT OUR MARRIAGE': 7, 'The Trump Presidency: Last Week Tonight with John Oliver (HBO)': 7, 'Racist Superman | Rudy Mancuso, King Bach amp; Lele Pons': 8, 'Nickelback Lyrics: Real or Fake?': 7, 'I Dare You: GOING BALD!?': 7, '2 Weeks with iPhone X': 7, 'Roy Moore amp; Jeff Sessions Cold Open - SNL': 6, '5 Ice Cream Gadgets put to the Test': 7, 'The Greatest Showman | Official Trailer 2 [HD] | 20th Century FOX': 2, 'Why the rise of the robots won’t mean the end of work': 2, "Dion Lewis' 103-Yd Kick Return TD vs. Denver! | Can't-Miss Play | NFL Wk 10 Highlights": 1,......
  

Как вы можете видеть, значение the dct дает другое значение, чем в выводе diff_date . Чего я ожидал, так это:

 {'WE WANT TO TALK ABOUT OUR MARRIAGE': 1, 'The Trump Presidency: Last Week Tonight with John Oliver (HBO)': 1, 'Racist Superman | Rudy Mancuso, King Bach amp; Lele Pons': 2, 'Nickelback Lyrics: Real or Fake?': 1, 'I Dare You: GOING BALD!?': 2.......
  

Я не уверен, почему это дает другое значение. Я ожидаю, что значение останется неизменным, верно?

* Обратите внимание, что входными данными для функции являются объекты класса Video

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

1. Попробуйте сравнить dct с [(x.name, (x.trending_date - x.publish_date).days) for x in videos] , и вы будете просветлены.

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

Ответ №1:

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

 from collections import OrderedDict 

def vid(videos):
     dct = OrderedDict() 
     diff_date = [(x.trending_date - x.publish_date).days for x in videos]
     for x in videos:
       dct[x.title] = (x.trending_date - x.publish_date).days
     print(diff_date)
     print(dct)
  

Это словарь порядка. Это занимает больше места, но сохраняет упорядоченность. Для получения дополнительной информации ознакомьтесь здесь