Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2018, 19:11   #1
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию возможно ли на питоне такое сравнение?

хочу более точнее сравнить типы.можно ли в sorted прописать чтобы она вызывала другую функцию и там более точно происходило сравнение? например так,на с++ показал ниже как хочу сравнить.


Код:
if (a[i] - b[i] > eps) return false;
        else if (b[i] - a[i] > eps) return true;
Код:
h = []
h[0] = {5.1233,4.4, 312.3213222}
h[1] = {4.9, 312.321322}
h[2] = {5.9132132, 312.3213212122}
h[3] = {6.9132132, 312.3213212122}
sorted_list = sorted(h.items(), key=lambda x: (len(x[1]), x[1]))
print(' '.join(str(i + 1) for i, _ in sorted_list))


Код:
#include <pch.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#define repeat(i, n) for (int i = 0; i < n; ++i)
 
using namespace std;
 
inline bool comp(const vector<long double> & a, const vector<long double> & b) { // вызываю функцию
    long double eps = 1e-12;
    repeat(i, a.size()) { 
        if (a[i] - b[i] > eps) return false; // сравниваю более точно
        else if (b[i] - a[i] > eps) return true;
    }
    return false;
}
 
int main() {
    int n = 3;// количество векторов
    
    vector<vector<long double>> towers(n);// двухмерный вектор
    for (int i = 0; i < towers.size(); i++) { // пока меньше общее количества
        vector<long double> &v = towers[i];// ввод конкретного вектора
        double a,b;
        cin >> a; // тут ввожу числа с точкой например 1.343423434
        v.push_back(a);
        cin >> b;
        v.push_back(b);
    }
    vector<int> inds(n); // по циклу фор даю индекса
 
    repeat(i, n) {
        inds[i] = i;
    }
    sort(inds.begin(), inds.end(), [&](int i1, int i2) { // на вход поступают два индекса i1 и i2
        return towers[i1].size() < towers[i2].size() // если высота различается тогда сразу выдаем ответ
            || towers[i1].size() == towers[i2].size() && comp(towers[i1], towers[i2]); // если одинаковая, то сравниваем лексикографически
    });
    repeat(i, n) cout << inds[i] + 1 << ' ';
 
    }
Александр121 вне форума Ответить с цитированием
Старый 06.09.2018, 19:34   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

С чего вдруг это более точное? Скорее наоборот.

Для сортировки разве есть смысл так сравнивать? Это скорее для равенства.

А так key же и есть для этого.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.09.2018, 03:15   #3
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
С чего вдруг это более точное
Тип float у него погрешность огромная.так она будет меньше
Александр121 вне форума Ответить с цитированием
Старый 07.09.2018, 10:10   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

1.125 и так будет рядом с 1.12500000009.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 08.09.2018, 02:57   #5
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А так key же и есть для этого.
А в кей можно прописать точность?
Александр121 вне форума Ответить с цитированием
Старый 08.09.2018, 04:20   #6
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вы же сортируете числа, а не проверяете равно ли одно число другому.
да,просто он на каких то числах близких ошибается.думал вдруг как то усилить можно
Александр121 вне форума Ответить с цитированием
Старый 08.09.2018, 04:54   #7
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Вы, вероятно, не понимаете, что введение погрешности эпсилон как раз понижает точность сравнения
Black Fregat вне форума Ответить с цитированием
Старый 09.09.2018, 08:27   #8
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Вы, вероятно, не понимаете
Тут на удачу) Может так точнее а может и наоборт точнее. и так и так не точно.наиболее тончнее наверное fabs(a-b)>e
Александр121 вне форума Ответить с цитированием
Старый 09.09.2018, 09:19   #9
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
понижает точность сравнения
я протестировал,да вы правы сравнение и такое довольно точное
Александр121 вне форума Ответить с цитированием
Старый 09.09.2018, 10:27   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут тестирование? Вы не понимаете, что сравнивая с эпсилоном вы никак не повысите точность, он не для этого нужен?
При проверке на равенство это используется чтоб сравнивать до какого-то нужного знака, чтоб не мешал какой-нибудь пятнадцатый знак после запятой, типа 1.123456 == 1.123456000000009
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно ли сделать такое?... troyan32 Общие вопросы Delphi 9 08.04.2011 16:31
Возможно ли такое? Vlad.V Microsoft Office Excel 28 13.01.2011 18:51
Оказывается, возможно и такое... Alex Cones Свободное общение 15 06.11.2009 17:55
Возможно реализовать такое Devourer12345 Microsoft Office Access 10 15.08.2008 08:08