Страницы

Поиск по вопросам

Показаны сообщения с ярлыком условия. Показать все сообщения
Показаны сообщения с ярлыком условия. Показать все сообщения

воскресенье, 29 марта 2020 г.

Особенности использования условий в DataFrame

#python #pandas #dataframe #условия


Есть DataFrame, в котором надо заполнить col3 данными из col2 по условию:

mask = ((df['col3'].isnull()) & (df['col1'] == 2))


 col1   col2    col3
0   2   2   NaN
1   3   1   NaN
2   2   1   NaN
3   3   1   NaN
4   2   2   NaN


Вывожу данные, которые должны быть изменены в col3:

mask = ((df['col3'].isnull()) & (df['col1'] == 2))
df.loc[mask]

 col1   col2 col3
0   2   2   NaN
2   2   1   NaN
4   2   2   NaN


Выполняю заполнение:

df.loc[mask, 'col3'] = df['col2']
df


Проверяю результат:

df
 col1   col2 col3
0   2   2   2.0
1   3   1   NaN
2   2   1   1.0
3   3   1   NaN
4   2   2   2.0


Все ОК, но на большом объеме данных так не проверишь.

Повторно использую для этого маску:

df.loc[mask]

 col1 col2  col3
0   2   2   2.0
2   2   1   1.0
4   2   2   2.0


Ожидал, что будет пустой список, т.к. col3 заполнена данными, а в маске существует
условие df['col3'].isnull() - выводить только незаполненные.

Почему так произошло и в чем я ошибся?
    


Ответы

Ответ 1



Логическая ошибка в том, что переменная mask была создана до заполнения col3. In [12]: df Out[12]: col1 col2 col3 0 2 2 2.0 1 3 1 NaN 2 2 1 1.0 3 3 1 NaN 4 2 2 2.0 Создаем логическую маску после обновления: In [13]: mask = ((df['col3'].isna()) & (df['col1'] == 2)) и получаем пустой DataFrame: In [14]: df.loc[mask] Out[14]: Empty DataFrame Columns: [col1, col2, col3] Index: [] PS методы .isnull() / .notnull() являются устаревшими, лучше использовать .isna() / .notna().

среда, 4 марта 2020 г.

Сравнение скорости для команд оканчивающие цикл: jcxz vs cmp cx, 0 je

#ассемблер #условия #tasm


Добрый день, использую tasm (Turbo assembler) и мне стало жутко интересно какая же
конструкция работает быстрее : 

jcxz метка


или

cmp cx, 0
je метка


причем Vim не подсвечивает вариант с jcxz
    


Ответы

Ответ 1



Вторая конструкция будет дольше выполняться по тактам, следовательно медленнее. Не зря же команду придумали разработчики архитектуры x86... Подробности тут: Источник

Стоит ли создавать новый класс для вариации алгоритма?

#java #алгоритм #классы #условия


Есть класс А, который реализует некий алгоритм.
На главной форме есть чекбокс, при отметке которого алгоритм выполняется с небольшими
изменениями в логике.
Также могут появиться еще много чекбоксов, которые по-немногу меняют логику алгоритма.
Получается, для обработки всех чекбоксов в алгоритме класса А надо будет писать много
условий, код усложняется как визуально, так и для понимания.  

Или лучше создавать новые классы А2, А3 и т.д., которые "в чистом виде" будут реализовывать
свои вариации алгоритма?
    


Ответы

Ответ 1



На мой взгляд лучше создать новый класс под каждый алгоритм. Т.е. вы создаете интерфейс допустим такой: interface AlgoritmExecutor{ execute(); } И для каждого класса алгоритмов его реализуете, и сам алгоритм пишите в нем. В этом случае при добавлении нового алгоритма Вам надо будет написать новый класс, а не лезть в старый, добавляя новые условия. Но остается вопрос как выбирать нужный класс. Тут моё предложение не лучшее. Создать фабрику, которая будет принимать пачку boolean за каждый чекбокс. class AlgoritmFactory{ static AlgoritmExecutor chooseAlgoritm(boolean... checkbox){ //тут исходя из включенных чекбоксов выбираете нужный класс алгоритма } } Это удобно тем, что в слое вида вы обращаетесь к фабрике, передаете ей все чекбоксы и получаете выбранный алгоритм в виде интерфейса. public void algoritmAction(){ AlgoritmExecutor algoritm = AlgoritmFactory(checkbox1.isEnabled(), checkbox2.isEnabled(), checkbox3.isEnabled()); algoritm.execute(); } но фабрика становится не очень понятна для стороннего читателя из-за пачки булевых значений.

среда, 26 февраля 2020 г.

Switch quantity on integer | *** wasnt declared in this scope

#cpp #условия #switch


#include 


using namespace std;

/* run this program using the
console pauser or add your own getch,
system("pause") or input loop */

int main(int argc, char** argv) {
    string lang;
    cout << "Choose your language: rus/eng" << endl;
    cin >> lang;
    switch (lang) { //здесь первая ошибка switch quantity on integer
        case eng:
            cout << "You choose english" << endl; //тут
            break;
        case rus:
            cout << "You choose russian" << endl; //и тут вторая ошибка rus(в случае
выше eng) wasnt declared in this scope
            break;
    }
    return 0;
}


Не первый раз ошибка *** wasnt declared in this scope, так и не могу понять в чем дело
    


Ответы

Ответ 1



switch нельзя использовать с string. Используйте if ... else

Ответ 2



switch нельзя использовать с string.

Как выводить результат с заданной пользователем точностью?

#java #математика #условия #точность


Условие: Написать программу, вычисляющую число   с точностью, задаваемой пользователем.
Известно, что сумма ряда 1-1/3+1/5-1/7+1/9-…приближается к значению  pi/4 при достаточно
большом количестве членов ряда.

public class Class {
    public static void main(String[] args) {
        double a = 3;
        double sum=1;
        for (int i=0;i<1000;i++){

            if (i%2==0){
                sum=sum-1/a;
            }
            if (i%2!=0){
                sum=sum+1/a;
            }
            a+=2;
        }
        double pi=sum*4;
        System.out.println(pi);

    }
}


Само pi я рассчитал, но как задать количество знаков после запятой? 
    


Ответы

Ответ 1



Можно вот так: String.format("%.2f", value); Взято из: https://stackoverflow.com/a/1276096/2871225

Ответ 2



От вас требуется не вывести число с определенным количеством знаков, а посчитать с определенной точностью. Ваш алгоритм делает фиксированное количество шагов for (int i=0;i<1000;i++) А должен останавливаться при достижении нужной точности, например так while (Math.abs(1 / a) > e) где e - введенное пользователем число, например 0.0001

воскресенье, 9 февраля 2020 г.

Четность/нечетность отрицательных чисел

#cpp #if #условия


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

void input (ofstream &in) {
vector  arr;
generate_n (back_inserter (arr), 100,
            [] {return rand() % 101 - 50;});
transform(arr.begin(),arr.end(),
          ostream_iterator(in, "   "),
          [] (int x) {return x;});
}
vector  inputfile(ifstream & out) {
    vector  arr;
    transform(istream_iterator(out),istream_iterator(), back_inserter(arr),
[] (int x) {return x;});
    return arr;
}
vector  modify (vector  & other) {
    int var = 0;
    vector  arr;
    var = accumulate(other.begin(), other.end(), 0) / 100;
    cout << "Sum of Array = " << var << endl << endl;
    transform(other.begin(), other.end(), back_inserter(arr), [&var] (int x) {
        if (x % 2 == 1) //здеcь задается условие проверки
            x /= var;
        return x;
        });
    return arr;
}


Дело в том что программа делит только положительные нечетные числа, а отрицательные
игнорирует
    


Ответы

Ответ 1



Замените условие if (x % 2 == 1) на условие if (x % 2 != 0) Проблема в том, что первое условие для отрицательных чисел дает отрицательный остаток.:) Посмотрите результат этой демонстрационной программы #include int main() { int x = -11; std::cout << x % 2 << '\n'; return 0; } Вывод на консоль: -1 Обратите внимание на то, что вместо алгоритма std::transform в том контексте, в котором вы его используете, проще использовать алгоритм std::copy.

Ответ 2



Возможна проверка используя операцию логическое И. int a = -10; int b = -11; std::cout<< (a & 1)<<'\n'; std::cout<< (b & 1)<< '\n'; output: 0 1

вторник, 28 января 2020 г.

if else else else через тернарный оператор Swift

#swift #if #условия


Не могу вывести ниже изложенное выражение через тернарные операторы. Может кто-то
подскажет?

let child = 0    
let teenager = 12    
let youth = 16    
let adult = 25    
let mature = 40    
let elderly = 55    
let aged = 75    
let anton = 31    
var age: String    

if anton > aged {        
    age = "is aged"        
} else {        
    if anton > elderly {            
        age = "is elderly"            
    } else {            
        if anton > mature {                
            age = "is mature"                
        } else {                
            if anton > adult {                    
                age = "is adult"                    
            } else {                    
                if anton > youth {                        
                    age = "is youth"                        
                } else {                        
                    if anton > teenager {                            
                        age = "is a teenager"                            
                    } else {                            
                        if anton > child {                                
                            age = "is a child"                                
                        } else {                                
                            age = "was never born"                                
                        }                            
                    }                        
                }                    
            }                
        }            
    }
}
print("Anton \(age)")

    


Ответы

Ответ 1



не знаю зачем вам это let child = 0 let teenager = 12 let youth = 16 let adult = 25 let mature = 40 let elderly = 55 let aged = 75 let anton = 31 var age: String age = (anton > aged ? "aged" : (anton > elderly ? "is elderly" : (anton > mature ? "is mature" : (anton > adult ? "is adult" : (anton > youth ? "is youth" : (anton > teenager ? "is a teenager" : (anton > child ? "is a child" : "was never born"))))))) print("Anton \(age)")

Ответ 2



Никогда не стоит делать столько вложенных if - else, такой код не возможно читать. switch - case тоже не очень удобный вариант. Предлагаю такое решение, создаете словарь, где число это ключ и текст значение. Далее создаете цикл и проходите по каждому ключу и сравниваете его с нужным вам значением, как только ключ больше чем значение, значит выводите текст с данным ключем. var dictionary = [0 : "is a child", 12 : "is a teenager", 16 : "is youth", 25 : "is adult", 40 : "is mature", 55 : "is elderly", 75 : "is aged"] var age: String = "was never born" let anton = 31 var temp = 0 for (key, value) in dictionary { if anton > key && key > temp { age = value temp = key } } print("anton \(age)") Обратите внимание на переменную var temp = 0, она создана для того, чтобы сохранять максимальный возраст, который был найдет в словаре, так как словарь не гарантирует вам порядок элементов, в отличии от массива, вы не можете просто пройти по словарю и найти то значение, которое будет больше чем anton. Как только в цикле нашли элемент, который больше чем anton, сохраняем значение в temp и идем дальше по словарю, в поисках элемента который больше чем anton И больше чем temp.

вторник, 31 декабря 2019 г.

Интегральные типы

#cpp #типы #условия


Почему конструкция switch case работает только с интегральными типами, и что вообще
такое интегральные типы?
    


Ответы

Ответ 1



Термин "integral" ("интегральный") является синонимом термина "integer" ("целочисленный"). Так что интегральные типы - это просто все целочисленные типы. Конструкция switch/case работает только с целочисленными типами потому, что, во-первых, ей нужен тип с четко и однозначно определенным отношением строгого равенства, что, например, исключает использование плавающих типов. В этом отношении switch/case аналогичен нетиповым шаблонным параметрам, которые тоже поддерживают только типы с четко определенным отношением равенства. Во-вторых, эта конструкция изначально задумывалась не просто как "синтаксический сахар", а с задней мыслью о том, что во многих случаях структура переходов в switch/case будет поддаваться очевидным оптимизациям: табличной реализации или реализации через прямое вычисление целевого адреса. Для "сложных" типов, вроде строк, возникновение возможности такой оптимизации выглядит существенно менее вероятным, чем для целочисленных типов. Разумеется, в современном С++ не составило бы, наверное, большого труда расширить диапазон поддерживаемых в switch/case типов. Но, насколько я знаю, таких планов пока нет.

Ответ 2



Сначала представим как работает эта конструкция. Не точно, но логика такая: int val[] = {3, 4, 7}, Cswitch_case =4; for (int i = 0; i < 3; ++i) { if (!(val[i] ^ Cswitch_case)) // так проверяет switch cout << i; Т.е. выполняется битовая операция, результат которого дает команду по какой метке выполнять программу. (правда, еще проверку, что оба нули, я не дописал). А для неинтегральных типов, обычно это невозможно. Например: } string s1("first"), s2 = s1; // if(!(s1 ^ s2)) эта битовая операция невозможна // cout << "...."; Поэтому было введено ограничение...

пятница, 13 декабря 2019 г.

Насколько хорошим тоном является добавление условий в счётчик for()?

#cpp #условия #for


Пишу программу, в которой очень бы хотелось использовать подобную конструкцию (пример
кода), но я не уверен, что это хороший стиль программирования, не могли бы вы подсказать,
так ли это?

for(int i = 0; i < size && statement1 && statement2; i++)


Заранее спасибо
    


Ответы

Ответ 1



Это вопрос стиля и личных предпочтений. Я лично считаю, что удобочитаемость кода получается намного выше, если заголовок "поискового" цикла описывает весь потенциальный диапазон, по которому производится поиск, а собственно проверка частных поисковых условий (которые могу вызвать "досрочное" завершение цикла) делается в теле цикла. Например, найти символ 'a' в строке s unsigned i; for (i = 0; s[i] != '\0'; ++i) if (s[i] == 'a') break; а не unsigned i; for (i = 0; s[i] != '\0' && s[i] != 'a'; ++i) ; То есть заголовок цикла описывает где мы ищем, а тело цикла описывает что мы ищем. Разумеется, разграничение между этими понятиями не всегда является четким и, еще раз, это вопрос стиля и личных предпочтений.

Ответ 2



На практике очень часто встречаемая конструкция. Однако, идеоматически цикл for используется для известного перед началом цикла числа повторов, а для цикла, в котором условие завершения становится истинным при вычислениях (в т.ч. проверке значения элементов массива) предназначены циклы while и do { ... } while(); Если statement1 и statement2 из вашего вопроса не меняются внутри цикла, то лучше вынести их в if перед циклом for. Иначе, лучше написать цикл while (впрочем, это дело вкуса, реально никто за такой for ругать не будет).

четверг, 28 ноября 2019 г.

Как работает оператор else if и в чем отличие от if?

#любой_язык #условия


Чем отличается оператор else if от обычного if ? 

Цепочка операторов из if-else if

if (condition)
    statement;
else if (condition)
    statement;
else if (condition)
    statement;


Цепочка операторов из if

if (condition)
    statement;
if (condition)
    statement;
if (condition)
    statement;


Есть ли между ними разница в работе?
    


Ответы

Ответ 1



Достаточно рассмотреть простой пример, чтобы понять, в чем заключается разница. int x = 0; if ( x == 0 ) { System.out.printline( "x = " + x ); ++x; } else if ( x == 1 ) { System.out.printline( "x = " + x ); ++x; } else if ( x == 2 ) { System.out.printline( "x = " + x ); ++x; } Вывод на консоль будет x = 0 А если этот код переписать в виде if ( x == 0 ) { System.out.printline( "x = " + x ); ++x; } if ( x == 1 ) { System.out.printline( "x = " + x ); ++x; } if ( x == 2 ) { System.out.printline( "x = " + x ); ++x; } то вывод на консоль будет x = 0 x = 1 x = 2 То есть в первом случае предложения if выполняются в зависимости от условий, а во втором случае они выполняются безусловно, то есть не зависит от выполнения предыдущих if предложений.

Ответ 2



Есть. Формат if/else if гарантирует, что при выполнении какого-либо из условий блоки с другими условиями не будут выполнены. При использовании цепочки if это не гарантируется. Например: int a = 10; if( a > 1 ) System.out.println( "Переменная 'a' больше 1" ); if( a > 5 ) System.out.println( "Переменная 'a' больше 5" ); Будут выполнены оба блока, и выведется: Переменная 'a' больше 1 Переменная 'a' больше 5

Ответ 3



Как такового оператора else if нет, это лишь использование ещё одного if в ветке else другого if. Но разница между ними есть. В первом случае второе условие отработает, если не отработает первое, а третье - если не отработает второе. Во втором случае отработают все условия (если где-то не возникнет, скажем, исключение). НО. Судя по вашему коду, условия у вас одинаковые. Поэтому в первом случае сработает тоьлко первый if или не сработает ничего. А во втором либо сработают все три if, либо не сработает ничего

Ответ 4



Во втором случае у вас проверяются всегда все условия. В первом случае если выполнится первое условие остальные уже не проверяются

Ответ 5



Вообще, конструкция if (condition) statement; else if (condition) statement; else if (condition) statement; чаще всего применяется, когда нужно в зависимости от того, чему равно проверяемое значение, выполнить несколько вариантов действий. И вообще по-идее в таких ситуациях нужно пользоваться оператором ветвления (switch\case\select и т.д). Но во многих языках он обладает неприятными ограничениями, которые заставляют пользоваться вышеупомянутой конструкцией. Зачем вставлять else, если логика последующих if такова, что проверку пройдёт только один? Чтобы избежать лишних проверок и явно указать читателю исходного кода, что здесь реализован по сути оператор ветвления. В некоторых языках реализован специальный оператор elseif\elsif\elif позволяющий избегать лишнего вложения блоков.

Ответ 6



В if вы даёте условие и если оно не выполняется можете вызвать else . Но в случаях когда нужно проверять условие одно за одним можно использовать конструкцию else if . И тогда в else if вы вписание ещё одно условие . int x = 1; if(x==3){ System.out.println("Это число 5");//к сожелению не выведет }else if(x==2){ System.out.println("Это число 2");//к сожелению не выведет }else if(x==1){ System.out.println("Это число 1");//выведет вот это }else { System.out.println("Число вообще не ходит"); }

Ответ 7



Так же можно воспользоватся оператором множественного выбора switch(). int value; cin >> value; switch(value){ case 1: return value+1; case 2: return value+2; default: return value; }

Ответ 8



Да, в else-if варианте переход к следующей ветке происходит только тогда, когда предыдущая дала результат false. int a = 1 int b = 2 int c = 3 if (a == 1) statement; else if (b == 2) statement; // эта ветка не будет выполнена else if (c == 3) statement; // эта ветка не будет выполнена Если Вы уберете все else-if, все три ветки будут выполнены. Поэтому else-if используется как последовательность, которая должны быть проверена, если предыдущая дала неверный результат.

вторник, 21 мая 2019 г.

Сравнение скорости для команд оканчивающие цикл: jcxz vs cmp cx, 0 je

Добрый день, использую tasm (Turbo assembler) и мне стало жутко интересно какая же конструкция работает быстрее :
jcxz метка
или
cmp cx, 0 je метка
причем Vim не подсвечивает вариант с jcxz


Ответ

Вторая конструкция будет дольше выполняться по тактам, следовательно медленнее.
Не зря же команду придумали разработчики архитектуры x86...
Подробности тут:
Источник

понедельник, 20 мая 2019 г.

Стоит ли создавать новый класс для вариации алгоритма?

Есть класс А, который реализует некий алгоритм. На главной форме есть чекбокс, при отметке которого алгоритм выполняется с небольшими изменениями в логике. Также могут появиться еще много чекбоксов, которые по-немногу меняют логику алгоритма. Получается, для обработки всех чекбоксов в алгоритме класса А надо будет писать много условий, код усложняется как визуально, так и для понимания.
Или лучше создавать новые классы А2, А3 и т.д., которые "в чистом виде" будут реализовывать свои вариации алгоритма?


Ответ

На мой взгляд лучше создать новый класс под каждый алгоритм.
Т.е. вы создаете интерфейс допустим такой:
interface AlgoritmExecutor{ execute(); }
И для каждого класса алгоритмов его реализуете, и сам алгоритм пишите в нем. В этом случае при добавлении нового алгоритма Вам надо будет написать новый класс, а не лезть в старый, добавляя новые условия.
Но остается вопрос как выбирать нужный класс. Тут моё предложение не лучшее. Создать фабрику, которая будет принимать пачку boolean за каждый чекбокс.
class AlgoritmFactory{ static AlgoritmExecutor chooseAlgoritm(boolean... checkbox){ //тут исходя из включенных чекбоксов выбираете нужный класс алгоритма } }

Это удобно тем, что в слое вида вы обращаетесь к фабрике, передаете ей все чекбоксы и получаете выбранный алгоритм в виде интерфейса.
public void algoritmAction(){ AlgoritmExecutor algoritm = AlgoritmFactory(checkbox1.isEnabled(), checkbox2.isEnabled(), checkbox3.isEnabled()); algoritm.execute(); }
но фабрика становится не очень понятна для стороннего читателя из-за пачки булевых значений.

четверг, 28 марта 2019 г.

if else else else через тернарный оператор Swift

Не могу вывести ниже изложенное выражение через тернарные операторы. Может кто-то подскажет?
let child = 0 let teenager = 12 let youth = 16 let adult = 25 let mature = 40 let elderly = 55 let aged = 75 let anton = 31 var age: String
if anton > aged { age = "is aged" } else { if anton > elderly { age = "is elderly" } else { if anton > mature { age = "is mature" } else { if anton > adult { age = "is adult" } else { if anton > youth { age = "is youth" } else { if anton > teenager { age = "is a teenager" } else { if anton > child { age = "is a child" } else { age = "was never born" } } } } } } } print("Anton \(age)")


Ответ

не знаю зачем вам это
let child = 0 let teenager = 12 let youth = 16 let adult = 25 let mature = 40 let elderly = 55 let aged = 75 let anton = 31 var age: String
age = (anton > aged ? "aged" : (anton > elderly ? "is elderly" : (anton > mature ? "is mature" : (anton > adult ? "is adult" : (anton > youth ? "is youth" : (anton > teenager ? "is a teenager" : (anton > child ? "is a child" : "was never born")))))))
print("Anton \(age)")

понедельник, 29 октября 2018 г.

Меняют ли состояние программы операции ветвления?

Многие операции меняют состояние программы через присваивание, приведение и т.д. Меняют ли состояние программы операции ветвления (условные операторы)? Или они просто переводят, в зависимости от некоторых условий, в одну из частей общего состояния?
Я так пониманию состояние программы это вся совокупность вычисляемых и/или используемых значений, потенциально изменчивых и/или постоянных в данный момент работающей программы. Могу конечно ошибаться.


Ответ

Текст программы лучше всего представить себе в виде набора пересекающихся дорог, а состояние выполняющего эту программу процесса — как машину, едущую по этим дорогам.
При этом ветвлениям соответствуют развилки дорог, циклам — круговое движение, и т. д. Любая операция есть продвижение машины по дороге, ветвление — выбор одной из дорог на развилке и продвижение по выбранной дороге.
Таким образом, ветвление не есть состояние, это лишь свойство «дорожной сети», её форма. А вот прохождение программой ветвления, как и любая другая операция, изменяет положение машины на дороге, то есть, состояние программы.