«отсортированный 1-мерный итератор» на основе «2-мерного итератора» ”(Декартово произведение итераторов)

Я ищу чистый способ сделать это в Python:

Допустим, у меня есть два итератора «iter1» и «iter2»: возможно, генератор простых чисел , и itertools.count (). Я априори знаю, что оба они бесконечны и монотонно возрастают. Теперь я хочу выполнить простую операцию с двумя аргументами «op» (возможно, operator.add или operator.mul) и вычислить каждый элемент первого итератора с каждым элементом затем, используя указанную операцию, затем выводите их по одному, отсортировав. Очевидно, это сама бесконечная последовательность. (Как упоминалось в комментарии @RyanThompson: это будет называться декартовым произведением этих последовательностей ... или, точнее, 1d-сортом этого произведения.)

Каков наилучший способ to:

  • заключить "iter1", "iter2" и "op" в итерацию, которая сама дает значения в монотонно увеличивающемся выводе.

Допустимые упрощающие предположения:

  • Если это помогает, мы можем предположить op (a, b)> для минимума из всех возможных значений next () и вывести его. Но эта странная агломерация из кучи и кучи двухсторонних дек просто кажется диковинной, даже до того, как я начну ее кодировать.

    Пожалуйста: не не основывайте свой ответ на том факте, что в моих примерах упоминались простые числа или счет () .... У меня есть несколько применений этой самой концепции, которые НЕ связаны с простыми числами и count ().


    ОБНОВЛЕНИЕ: OMG! Какая отличная дискуссия! И несколько отличных ответов с действительно подробными объяснениями. Спасибо. StackOverflow Rocks; вы, ребята, молодцы.

    Я собираюсь в ближайшее время более подробно вникать в каждый ответ и дать примерному коду удар в уши. Из того, что я читал до сих пор, мои первоначальные подозрения подтверждаются, что для этого не существует "простой идиомы Python". Вернее, так или иначе, я могу » t избежать сохранения всех полученных значений iter1 и iter2 на неопределенный срок.

    FWIW: вот официальный «тестовый пример», если вы хотите попробовать свои решения.

    import operator
    
    def powers_of_ten():
        n = 0
        while True:
            yield 10**n
            n += 1
    
    def series_of_nines():
        yield 1
        n = 1
        while True:
            yield int("9"*n)
            n += 1
    
    op = operator.mul
    iter1 = powers_of_ten()
    iter2 = series_of_nines()
    
    # given (iter1, iter2, op), create an iterator that yields:
    # [1, 9, 10, 90, 99, 100, 900, 990, 999, 1000, 9000, 9900, 9990, 9999, 10000, ...]
    

12
задан Dan H 10 May 2011 в 13:01
поделиться