Klammern in Ausgabe einfügen (Python 3.4)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackJack

@nyxx: `primfaktoren` enthält zu viele Werte. Die meisten davon sind immer 0. Günstiger wäre es eine leere Liste anzulegen und jedes mal wenn man einen Faktor gefunden hat, diesen als Tupel (Faktor, Exponent) an die Liste anzuhängen. Oder man könnte sich an der Stelle mal Generatorfunktionen anschauen und die Tupel gar nicht in einer Datenstruktur speichern sondern ”liefern” sobald sie feststehen.

Ein bisschen Effizienter wird es wenn man nur die 2 und ab 3 alle ungeraden Zahlen testet, denn gerade Zahlen ausser der zwei kommen als Primfaktor ja nicht in Frage.

Das Formatieren der Ausgabe würde ich in eine eigene Funktion auslagern.

Ich komme dann auf so etwas:

Code: Alles auswählen

from __future__ import absolute_import, division, print_function
from itertools import chain, count


def factor(number):
    if number < 2:
        raise ValueError('n must be >= 2')
    for candidate in chain([2], count(3, 2)):
        if number == 1:
            break
        exponent = 0
        while number % candidate == 0 and number >= candidate:
            number //= candidate
            exponent += 1
        if exponent:
            yield (candidate, exponent)


def format_factors(factors):
    return '*'.join(
        str(factor) if exponent == 1 else '({0}^{1})'.format(factor, exponent)
        for factor, exponent in factors
    )


def main():
    numbers = [
        2, 42, 23, 4711, 1024, 208115618, 509018089, 185078311, 910167936
    ]
    for number in numbers:
        print('{0} = {1}'.format(number, format_factors(factor(number))))


if __name__ == '__main__':
    main()
nyxx
User
Beiträge: 11
Registriert: Sonntag 29. März 2015, 23:51

Super, danke euch beiden. Insbesondere an BlackJack für die eleganten Vorschläge. Ich denke jetzt ist das Thema ausreichend durchgekaut.
Antworten