Nano Hash - криптовалюты, майнинг, программирование

Python – определить перекрытие 3 диапазонов

У меня возник вопрос о том, как мне определить перекрытия трех диапазонов в Python без использования каких-либо существующих библиотек:

Например, если у меня есть три диапазона (10,20)(15,25)(18,30), как мне найти совпадения между ними?

Мой ответ должен быть (18,19,20)

Любая помощь приветствуется. Спасибо !

25.05.2012

  • Кроме того, что вы подразумеваете под этими заданными диапазонами? Объект диапазона в Python (range(10, 20)) имеет значение меньше второго, не считая, поэтому ожидаемый результат будет (18, 19). 26.05.2012
  • Дубликат 26.05.2012
  • @Steve Не дубликат, в этом вопросе задается конкретно два диапазона, а в этом вопросе задается три. Хотя это легко экстраполировать, это не дубликат. Очевидно, что общий ответ (данный здесь) является лучшим вариантом. 26.05.2012

Ответы:


1

Перекрытие идет от самой высокой начальной точки до самой низкой конечной точки:

ranges = [(10,20), (15,25), (18,30)]
starts, ends = zip(*ranges)
result = range(max(starts), min(ends) + 1)

Тестовое задание:

>>> print(*result)
18 19 20
25.05.2012
  • Большое спасибо. Впрочем, таких диапазонов у меня много (около миллиона). есть 3 диапазона, но таких сравнений нужно сделать около миллиона. Не могли бы вы рассказать мне о вычислительно быстром методе сравнения миллионов таких диапазонов. 28.05.2012
  • На моем компьютере это занимает около 2 секунд. Если вы на самом деле не создаете диапазоны в виде списков (например, используя Python 2.x и не используя xrange), и результаты огромны, это будет быстро. Если вам нужно создать реальные списки, и они огромны, никакой метод не поможет. 28.05.2012

  • 2

    Хотя ответ WolframH является лучшим ответом для этого случая, доступно более общее решение для поиска перекрытий, если вы не нужно беспокоиться о повторяющихся элементах, то есть использовать наборы и их intersection операцию.

    >>> set(range(10, 21)) & set(range(15, 26)) & set(range(18, 31))
    {18, 19, 20}
    

    Или, как более общее решение:

    ranges = [(10, 20), (15, 25), (18, 30)]
    set.intersection(*(set(range(start, finish+1)) for start, finish in ranges))
    
    25.05.2012
  • Красиво, и вам даже не нужно reduce: set.intersection(*(set(range(start, finish+1)) for start, finish in ranges)). 26.05.2012
  • @WolframH Хорошо, я не знал, что set.intersection() принимает несколько наборов, это круто. Я всегда чувствую себя грязным всякий раз, когда мне приходится прибегать к reduce(). Отредактировано. 26.05.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..