Вы можете использовать следующий код, если ваш пароль обязательно содержит номера буквенных специальных символов:
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();
}
Для фильтрации списка словарей не требуется понимание словаря.
Вы можете просто использовать понимание списка с условием, основанным на значении словаря:
res = [d for d in movies if d['imdb'] > 5.5]
что ваш код написан, понимание словаря создает пустой словарь в случаях, когда i['imdb'] <= 5.5
.
Альтернативой использованию использования списка является использование функции filter
из Python builtins
. Это принимает функцию и итерабельность и возвращает «объект фильтра», который сохраняет только элементы, которые при передаче через функцию возвращают True.
В этом случае это будет:
list(filter(lambda x:x["imdb"]>5.5, movies))
Я включил list()
вокруг всего, чтобы преобразовать объект фильтра в список, который вы можете использовать. Если вы хотите узнать больше о встроенном filter
, вы можете прочитать об этом здесь .
Другие ответы уже предоставили лучшие альтернативные способы сделать это, но давайте посмотрим, как вы это делали, и посмотрите, что происходит.
Если я удалю некоторые вещи из вашего кода, я 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
]