2016-03-08 4 views
0

Итак, я не использовал Python в то время, и я ржавый - я работаю над личным проектом, и API, который я использую, возвращает список словарей, которые представляют данные песни. То, что я пытаюсь сделать, - это существенно сократить возвращаемый список песен ТОЛЬКО тем, у кого рейтинг 5 (и удалить все остальные из списка). У меня есть код ниже, который, похоже, не работает. Кажется, что он ничего не удаляет и распечатывает весь список песен (что в моем случае становится довольно большим, так как это около 11 000 песен или около того).Проверка значения ключа в словаре в списке?

Как ему оказали помощь, я буду также опубликовать пример того, что возвращает API (для одной песни):

{ 
    'comment':'', 
    'rating':'0', 
    'albumArtRef':[ 
    { 
     'url': 'http://lh6.ggpht.com/...' 
    } 
    ], 
    'artistId':[ 
    'Aod62yyj3u3xsjtooghh2glwsdi' 
    ], 
    'composer':'', 
    'year':2011, 
    'creationTimestamp':'1330879409467830', 
    'id':'5924d75a-931c-30ed-8790-f7fce8943c85', 
    'album':'Heritage ', 
    'totalDiscCount':0, 
    'title':'Haxprocess', 
    'recentTimestamp':'1372040508935000', 
    'albumArtist':'', 
    'trackNumber':6, 
    'discNumber':0, 
    'deleted':False, 
    'storeId':'Txsffypukmmeg3iwl3w5a5s3vzy', 
    'nid':'Txsffypukmmeg3iwl3w5a5s3vzy', 
    'totalTrackCount':10, 
    'estimatedSize':'17229205', 
    'albumId':'Bdkf6ywxmrhflvtasnayxlkgpcm', 
    'beatsPerMinute':0, 
    'genre':'Progressive Metal', 
    'playCount':7, 
    'artistArtRef':[ 
    { 
     'url': 'http://lh3.ggpht.com/...' 
    } 
    ], 
    'kind':'sj#track', 
    'artist':'Opeth', 
    'lastModifiedTimestamp':'1330881158830924', 
    'clientId':'+eGFGTbiyMktbPuvB5MfsA', 
    'durationMillis':'418000' 
} 

И мой код выглядит следующим образом:

library = api.get_all_songs() 
    print("There are",len(library),"items in your music library") 
    for track in library: 
     if track['rating'] != 5: 
      library.remove(track) 
    print("You have",len(library),"favorite tracks!") 
    return library 

I добавлен в количество «любимых песен» (а также количество песен в библиотеке), чтобы проверить, будет ли мой цикл и оператор if удалять что-либо, а это не так (поскольку числа совпадают до и после loop). Я полагаю, что это имеет какое-то отношение к этому, так как код работает отлично в противном случае, он просто не обрезает список.

Если какой-либо дополнительный код необходим, я был бы более чем счастлив предоставить его.

+1

Редко удалять элементы из списка, который вы зацикливаете. Это похоже на распиливание ветви дерева, на которой вы сидите. :) Подробнее см. [Странный результат при удалении элемента из списка] (http://stackoverflow.com/q/6260089/4014959). Тем не менее, вы можете сделать это безопасно, если вы перейдете назад по списку. –

ответ

3

Попробуйте список понимание, чтобы отфильтровать список словарей:

library = ... 

good_songs = [ x for x in library if x['rating'] == '5' ] 
+0

Yup, собирался предложить сделать это так же. +1 – idjaw

+2

Основываясь на примере, который он дал, похоже, что рейтинги - это строки; сравнение должно быть, вероятно, 'if x ['rating'] == '5'' – Hamms

+0

Хороший улов! Я видел все целые числа, и только предполагаемый рейтинг тоже был целым. Я отредактирую. –

1

Этот API обрабатывает рейтинг в виде строки.

Вы оцениваете рейтинг как целое. Вот почему ни один трек никогда не удаляется.

+0

Я подумал, что с первой попытки и использовал этот код для проверки 'if track ['rating'] 0: library.remove (track)', и он фактически не фильтровал ничего, поэтому, возможно, они обрабатываются как целые числа? документация API не является на 100% понятной –

Смежные вопросы