2013-11-20 11 views
5

Прежде всего, моя цель - случайно получить только один элемент в обоих известных наборах. Поэтому мой первоначальный метод сначала пересекает два набора. А затем произвольно возьмите элемент из пересекаемого множества. Но это глупо, потому что мне нужны только элементы, но пересекающиеся множества.Каков алгоритм 'set.intersection()' в python?

Поэтому мне нужно найти алгоритм set.intersection().

Я сравниваю время затрат между методами 'set.intersection()' и 'для {для {}}'. Set.intersection() быстрее, чем другой (100 раз). Поэтому использование 'for {for {}}' для получения случайных элементов не является разумной идеей.

Какой алгоритм для set.intersection() в python?

+4

CPython один, то Jython, то IronPython один или PyPy один? : p ... Пока вернется правильный результат, когда вызывается 'set.intersection', любая реализация может делать это так, как она себя чувствует. Вы можете бесплатно скачать/посмотреть исходный код для какой-либо из реализаций, чтобы посмотреть, как они это делают ... –

+1

Какова ваша реальная модель использования? реальный вопрос: «Каков самый быстрый способ получить случайный элемент из пересечения двух множеств?» и это, вероятно, зависит от того, изначально ли ваши данные установлены или нет. –

ответ

8

The algorithm выглядит следующим образом: меньший набор зацикливается, и каждый элемент копируется в зависимости от того, найден он в большом наборе. Таким образом, это C эквивалент

def intersect(a, b): 
    if len(a) > len(b): 
     a, b = b, a 

    c = set() 
    for x in a: 
     if x in b: 
      c.add(x) 
    return c 

(Или:. return set(x for x in a if x in b))

+0

Это несколько отличается от того, где 'set.intersection' снабжается не установленными итерами (хотя там более одного итерабельного) –

+0

@JonClements: в этом случае он пропускает только свопинг. Первый аргумент должен быть 'set'. –

+0

Интересно. Есть ли способ гарантировать, что x идет из определенного набора, или он всегда больше? – mjacksonw

 Смежные вопросы

  • Нет связанных вопросов^_^