Фильтрация понимания словаря Python

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

private static final String NUMBERS = "0123456789";
private static final String UPPER_ALPHABETS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String LOWER_ALPHABETS = "abcdefghijklmnopqrstuvwxyz";
private static final String SPECIALCHARACTERS = "@#$%&*";
private static final int MINLENGTHOFPASSWORD = 8;

public static String getRandomPassword() {
    StringBuilder password = new StringBuilder();
    int j = 0;
    for (int i = 0; i < MINLENGTHOFPASSWORD; i++) {
        password.append(getRandomPasswordCharacters(j));
        j++;
        if (j == 3) {
            j = 0;
        }
    }
    return password.toString();
}

private static String getRandomPasswordCharacters(int pos) {
    Random randomNum = new Random();
    StringBuilder randomChar = new StringBuilder();
    switch (pos) {
        case 0:
            randomChar.append(NUMBERS.charAt(randomNum.nextInt(NUMBERS.length() - 1)));
            break;
        case 1:
            randomChar.append(UPPER_ALPHABETS.charAt(randomNum.nextInt(UPPER_ALPHABETS.length() - 1)));
            break;
        case 2:
            randomChar.append(SPECIALCHARACTERS.charAt(randomNum.nextInt(SPECIALCHARACTERS.length() - 1)));
            break;
        case 3:
            randomChar.append(LOWER_ALPHABETS.charAt(randomNum.nextInt(LOWER_ALPHABETS.length() - 1)));
            break;
    }
    return randomChar.toString();

}
5
задан jpp 13 July 2018 в 15:41
поделиться

4 ответа

Для фильтрации списка словарей не требуется понимание словаря.

Вы можете просто использовать понимание списка с условием, основанным на значении словаря:

res = [d for d in movies if d['imdb'] > 5.5]

что ваш код написан, понимание словаря создает пустой словарь в случаях, когда i['imdb'] <= 5.5.

12
ответ дан jpp 17 August 2018 в 12:30
поделиться

Альтернативой использованию использования списка является использование функции filter из Python builtins. Это принимает функцию и итерабельность и возвращает «объект фильтра», который сохраняет только элементы, которые при передаче через функцию возвращают True.

В этом случае это будет:

list(filter(lambda x:x["imdb"]>5.5, movies))

Я включил list() вокруг всего, чтобы преобразовать объект фильтра в список, который вы можете использовать. Если вы хотите узнать больше о встроенном filter, вы можете прочитать об этом здесь .

3
ответ дан Roy Js 17 August 2018 в 12:30
поделиться

Другие ответы уже предоставили лучшие альтернативные способы сделать это, но давайте посмотрим, как вы это делали, и посмотрите, что происходит.

Если я удалю некоторые вещи из вашего кода, я get:

[{} for i in movies}]

Глядя именно на это, должно быть понятно, почему словарь создается для каждого фильма. У вас есть оператор if внутри этого словаря, но поскольку он внутри, он не меняет, будет ли он создан.

Чтобы сделать это так, как вы это делали, вы бы по существу, нужно дважды проверить, что первая проверка не имеет значения:

[
   { k:v for (k,v) in i.items() if i.get("imdb") > 5.5 } for i in movies if i.get("imdb") > 5.5 
]

, которая может быть упрощена только до

[
   { k:v for (k,v) in i.items()} for i in movies if i.get("imdb") > 5.5
]

, и теперь, поскольку мы не меняем элемент, просто :

[
   i for i in movies if i.get("imdb") > 5.5
]
2
ответ дан Zev 17 August 2018 в 12:30
поделиться
0
ответ дан jpp 29 October 2018 в 15:43
поделиться
Другие вопросы по тегам:

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