Какой самый питонный способ создать цикл «For Loop», который фильтрует по словарю?

Объедините шаблон Bean с Builder. У вашего объекта не будет несогласованного состояния на полпути его конструкции, но он все равно займет 20+ заданных операций, и вы можете сделать свой объект неизменным (если хотите), но не YourObjectBuilder.

public class YourObject {
    private Type field1;
    private Type field2;
    private Type field3;
    ...
    YourObject ( Type field1 , Type field2 , Type field3 ... ) { }
}

public class YourObjectBuilder {
    private Type field1;
    private Type field2;
    private Type field3;
    ...

    public YourObjectBuilder() {
    }

    public YourObject make ( ) {
         return new YourObject ( field1 , field2 , field3 ... ) ;
    }

    public void setField1(Type t) {
        field1 = t;
    }

   public void setField2(Type t) {
        field2 = t;
   }

    public void setField3(Type t) {
        field3 = t;
    }
    ...
}
3
задан Kyle 17 March 2019 в 23:45
поделиться

2 ответа

Одним из решений, эквивалентным вашему коду, может быть

artists = [track['artists'][0]['name'] for track in songs['tracks']]
0
ответ дан Peteris 17 March 2019 в 23:45
поделиться

Прежде всего, то, что вы делаете - это операция «map» (преобразование элементов одного массива в другой массив / список), а не операция «filter» (удаление определенных элементов, соответствующих условию, из массив / список).

Во-вторых, вы не должны зацикливаться на диапазоне. Это цикл for in, а не традиционный цикл for, поэтому здесь нет индекса. Вместо этого каждая итерация содержит элемент в списке / массиве.

artists = []
for track in songs['tracks']:
    artists.append(track['artists'][0]['name'])

Вы можете превратить это в однострочник, используя списки . Они принимают общую предпосылку итерации по списку для создания нового списка, возможно, трансформируя результаты и, возможно, фильтруя результаты. Синтаксис, который они используют:

result = [ <transformation> for item in items if <condition> ]

В вашем случае у вас нет явной необходимости в условии, поскольку вы просто отображаете один набор значений массива в другой, например:

[ 112]

Однако, если бы вы фильтровали, то если бы условие было тем, что вы бы использовали. Например

artists_with_long_songs = [ track[artists][0]['name'] for track in songs['tracks'] if track['length'] > 600 ]
0
ответ дан Soviut 17 March 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: