Страницы

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

пятница, 7 декабря 2018 г.

Удаление пустых элементов списка python

Извините за глупый вопрос, но как удалить пустые элементы из списка в пайтоне?


Ответ

Для начала стоит формализовать, что такое "пустой" элемент.
"Пустыми" можно считать многие элементы, например,
[], (), {}, set(), ''
в том числе
None, 0, 0.0, 0j, False
Если требуется выбросить из коллекции все такие элементы, то можно воспользоваться генератором списка
[value for value in values if value]
Или, если список не требуется, генераторным выражением:
(value for value in values if value)
Если правило определения "пустого" элемента более сложное, достаточно описать это правило после оператора if в указанных выше выражениях, например,
[value for value in values if value != [None]]
оставит в списке элементы, которыне не равны списку, содержащему None (важно заметить, что такой список будет пропущен в итоговый набор в первых случаях).

Как обработать исключение java.util.ConcurrentModificationException?

Есть код: ссылка на github. В ходе выполнения выбрасывается исключение Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Знающие люди подскажите как побороть проблему. Заранее спасибо)


Ответ

Его не надо обрабатывать. Это исключение значит, что вы в своем коде удаляете элемент напрямую из коллекции во время использования итератора. Т.к. в этом случае появляется неопределенность, откуда итератор должен продолжать и какие последующие элементы должен пройти, выбрасываетс исключение. Для корректного изменения сущности используйте методы итератора, например, iterator.remove()

Найти 2 элемента массива, сумма которых равна заданному числу

Задачка кажется очень простой, но все равно не выходит.
Дан массив целых чисел, упорядоченный строго по возрастанию.
Дано некоторое число X, нужно менее чем за квадратное количество операций(то есть перебор всех пар) найти такие два любых элемента массива, что их сумма равна X, иначе вывести 0.
Как сделать это меньше, чем за квадратное время?
Подкиньте идею какую-нибудь, ну или сам подход?)) Спасибо=)


Ответ

Решение за О(n): Решаем методом "2 указателя" Храним 2 индекса: первый сначала указывает на нулевой элемент, второй - на последний элемент. Цикл - пока индексы не будут равны (то есть пока они не укажут на один и тот же элемент. Если такое случилось - значит, искомых элементов в массиве нет). На каждой итерации цикла сравниваем текущую сумму (сумму элементов, на которые указывают индексы) с искомой. Если сумма меньше - увеличиваем первый индекс, если сумма больше - уменьшаем второй индекс. Если равна - решение найдено.
#include #include
using namespace std;
int main() { int *a; // массив int n; // количество элементов в массиве int sum; // необходимая сумма /// //чтение массива cin >> n; a = new int[n]; for (int i = 0; i < n; i++) cin >> a[i]; cin >> sum; /// // индексы int lt = 0; // первый, то есть левый int rt = n - 1; // второй, то есть правый while (lt != rt) { int cursum = a[lt] + a[rt]; if (cursum < sum) lt++; else if (cursum > sum) rt--; else // if (cursum == sum) { cout << "indexes: " << lt << " " << rt << endl; cout << "values: " << a[lt] << " " << a[rt] << endl; return 0; } } cout << "not found" << endl; return 0; }

Вопрос про абстракцию и полиморфизм в java

Загвоздка такова: по отдельности я более-менее понимаю, о чем эти 2 парадигмы:
Абстрактный класс с методами - своего рода шаблон,который наследуют другие классы. Объект такого класса нет смысла создавать, т.к. он абстрактен, но наследники могут использовать его методы и переопределять их. Полиморфизм - это возможность использовать метод с одним именем в разных классах, но по-разному его реализовывать, переопределяя. Также понимаю,что в принципе одну систему можно построить как на базе абстрактного класса,так и используя полиморфизм.
Но что использовать лучше и чем они отличаются - я не понимаю, не хватает совсем немного,чтобы додумать. Поясните, пожалуйста, что и как, если можно на примерах. Заранее большое спасибо.


Ответ

Это тесносвязанные базовые понятия ООП, они дополняют друг друга. Поэтому нельзя говорить "что использовать лучше". Как вы написали,
абстрактный класс с методами своего рода шаблон,который наследуют другие классы
Так вот, вы задаете определенный шаблон для дальнейшей реализации полиморфизма. Когда от этого абстрактного класса у вас будут 2 или более наследника, реализующие абстрактные методы. Это и будет полиморфизм. Также, часто помогает осознать что это сама расшифровка слова. "поли" - означает много, "морфа" - форма. Полиморфизм - много форм. Есть одна абстракция, и есть много реальных форм этой абстракции. Ещё стоит помнить, что полиморфизм в ООП не ограничивается этим, перегрузка методов - также является полиморфизмом: много форм у одного метода.
Ещё раз, не разделяйте понятия ООП и не пытайтесь выбрать "что лучше" - все базовые принципы ООП - костяк, и только используя все кости сразу вы добьетесь красивого результата (конечно, меру знать нужно, так что злоупотреблять не стоит).
UPD. касательно вашего комментария:
если мы имеем супер-класс,но не абстрактный и наследуем от него другие классы,использующие его метод. можно ведь при этом делать супер-класс не абстрактным. например класс "фигура" и классы-наследники "квадрат", "круг".все будут иметь метод "рисовать".
abstract public class Shape { int Color; Coordinates StartPoint; abstract public void Draw(); }
class Point extends Shape { public void draw() { // Здесь рисуется точка } }
class Circle extends Shape { public void draw() { // Здесь рисуется круг } }
class Square extends Shape { public void draw() { // Здесь рисуется квадрат } }
Если суперкласс будет неабстрактным в данной ситуации, то либо придется писать реализацию draw() для класса Shape, которую не особо понятно как делать, либо же вообще Shape не будет ничего знать про метод draw() и тогда не получится сделать то, что описано ниже.
Зачем все это вообще нужно? Потому что когда-нибудь у вас будет много разных фигур, например, в массиве:
List shapes = shapes(); // Получим откуда-то его. shapes.forEach(Shape::draw);
И всё, мы отрисовали все квадраты, круги, точки. И для каждой фигуры вызвался свой метод draw.
Это так же ответ на вопрос:
а зачем нам выделять из нескольких классов общие черты и плодить еще один дополнительный класс?

Стилизировать первые 3 символа в тексте на css

Как на js или css стилизировать первые 3 символа в тексте? Нужно их скрыть или сделать прозрачными.

  • 1. Анкор (41)

  • Ответ

    Ну коли можно пользоваться скриптами теперь, то: Вариант на jq:
    $('input').on('click', function() { $('.cat-item a').each(function() { var text = $(this).text(); text = '' + text.substr(3, text.length); $(this).html(text); }) });

  • 1. hello!
  • 2. this
  • 3. is
  • 4. a test!

  • Как сделать эффект растущей цены (на подобие таймера)?

    На странице указана цена 126 рублей 00 копеек. Нужно эту цену каждую минуту увеличивать на 1 рубль. И также в течение минуты должны увеличиваться копейки, которые показывают, что цена растет. Как это можно реализовать? Если с рублями все понятно, используем setInterval и через каждые 60000мс пребавляем 1, то с копейками не могу сообразить.


    Ответ

    Решение с неточным таймером. var price = 126.00; updatePrice = function() { document.getElementById("price").innerHTML = XFormatPrice(price); price+=(100/60)/100; } updatePrice(); setInterval(updatePrice, 1000); function XFormatPrice(_number) { var format_string = '# руб.'; var r=parseFloat(_number) var exp10=Math.pow(10,2); r=Math.round(r*exp10)/exp10; rr=Number(r).toFixed(2).toString().split('.'); b=rr[0].replace(/(\d{1,3}(?=(\d{3})+(?:\.\d|\b)))/g,"\$1"+' '); r=(rr[1]?b+ ',' +rr[1]:b); return format_string.replace('#', r); }


    Заменить три блока if…else на более эстетичную запись

    Есть функция, которая принимает необязательный параметр: любое число. Все работает норм, пока это число !=0 function go(number){ let x = number || 10; console.log(x); } go()// вернет 10; go(20)// вернет 20; go(0)// вернет 10, а нужен 0;
    Проблема решается с помощью конструкции if..else..else, но для такой простой функции это слишком громоздко. Можно ли переписать как-то более эстетично?


    Ответ

    Попробуйте такой вариант:
    function go(number){ let x = number || number === 0 ? number : 10; console.log(x); } go()// вернет 10; go(20)// вернет 20; go(0)// вернет 0;