3 Stimmen

Probleme bei der Groß-/Kleinschreibung einer Zeichenkette in Python

Ich habe einen Namen als String, in diesem Beispiel "markus johansson".

Ich versuche, ein Programm zu programmieren, das 'm' und 'j' in Großbuchstaben schreibt:

name = "markus johansson"

for i in range(1, len(name)):
    if name[0] == 'm':
        name[0] = "M"
    if name[i] == " ":
        count = name[i] + 1
    if count == 'j':    
            name[count] = 'J'  

Ich bin mir ziemlich sicher, dass dies funktionieren sollte, aber ich erhalte diese Fehlermeldung:

File "main.py", line 5 in <module> 
   name[0] = "M" 
TypeError: 'str' object does support item assignment 

Ich weiß, dass es eine Bibliotheksfunktion namens .title() gibt, aber ich möchte "richtig programmieren".

Wie kann ich das beheben?

0 Stimmen

Ich schlage vor, dass Sie den Titel verbessern

0 Stimmen

Echte Programmierer verwenden die ihnen zur Verfügung stehenden Werkzeuge, insbesondere Bibliotheken.

0 Stimmen

Wer will schon ein richtiger Programmierer sein?

11voto

vartec Punkte 124396

Ich vermute, dass Sie damit etwas erreichen wollen:

from string import capwords
capwords(name)

Daraus ergibt sich:

'Markus Johansson'

EDIT: OK, ich sehe, Sie wollen eine offene Tür einreißen. Hier ist Low-Level-Implementierung.

''.join([char.upper() if prev==' ' else char for char,prev in zip(name,' '+name)])

0 Stimmen

Alter, er will "echte Programmierung, nicht Möchtegern" :)

0 Stimmen

Ja, echte Programmierer verwenden ganze Zahlen ;-)

1 Stimmen

Echte Programmierer bauen genetisch eine Armee von Schmetterlingen auf, die parallel auf die Festplatte schreiben.

9voto

Christian Witts Punkte 10801
>>> "markus johansson".title()
'Markus Johansson'

Eingebaute String-Methoden sind der richtige Weg.

EDIT: Ich sehe, Sie wollen das Rad neu erfinden. Gibt es dafür einen bestimmten Grund? Sie können aus einer beliebigen Anzahl komplizierter Methoden wählen wie:

' '.join(j[0].upper()+j[1:] for j in "markus johansson".split())

Standardbibliotheken sind nach wie vor das Mittel der Wahl.

0 Stimmen

Ja, ich wusste nicht, Titel, großer Tipp. Standard-Bibliothek rulez wieder.

0 Stimmen

j[1:] -> j[1:].lower() oder einfach j.capitalize() . str.split() lässt daher alle Leerzeichen weg ' '.join(...) macht etwas anderes als str.title() .

0 Stimmen

Dies ist die beste und einfachste Methode.

5voto

jfs Punkte 370717

string.capwords() (definiert in string.py )

# Capitalize the words in a string, e.g. " aBc  dEf " -> "Abc Def".
def capwords(s, sep=None):
    """capwords(s, [sep]) -> string

    Split the argument into words using split, capitalize each
    word using capitalize, and join the capitalized words using
    join. Note that this replaces runs of whitespace characters by
    a single space.

    """
    return (sep or ' ').join(x.capitalize() for x in s.split(sep))

str.title() (definiert in stringobject.c )

PyDoc_STRVAR(title__doc__,
"S.title() -> string\n\
\n\
Return a titlecased version of S, i.e. words start with uppercase\n\
characters, all remaining cased characters have lowercase.");
static PyObject*
string_title(PyStringObject *self)
{
    char *s = PyString_AS_STRING(self), *s_new;
    Py_ssize_t i, n = PyString_GET_SIZE(self);
    int previous_is_cased = 0;
    PyObject *newobj = PyString_FromStringAndSize(NULL, n);
    if (newobj == NULL)
        return NULL;
    s_new = PyString_AsString(newobj);
    for (i = 0; i < n; i++) {
        int c = Py_CHARMASK(*s++);
        if (islower(c)) {
            if (!previous_is_cased)
                c = toupper(c);
            previous_is_cased = 1;
        } else if (isupper(c)) {
            if (previous_is_cased)
                c = tolower(c);
            previous_is_cased = 1;
        } else
            previous_is_cased = 0;
        *s_new++ = c;
    }
    return newobj;
}

str.title() in reinem Python

class String(str):
    def title(self):
        s = []
        previous_is_cased = False
        for c in self:
            if c.islower():
               if not previous_is_cased:
                  c = c.upper()
               previous_is_cased = True
            elif c.isupper():
               if previous_is_cased:
                  c = c.lower()
               previous_is_cased = True
            else:
               previous_is_cased = False
            s.append(c)
        return ''.join(s)

Beispiel:

>>> s = ' aBc  dEf '
>>> import string
>>> string.capwords(s)
'Abc Def'
>>> s.title()
' Abc  Def '
>>> s
' aBc  dEf '
>>> String(s).title()
' Abc  Def '
>>> String(s).title() == s.title()
True

4voto

Zeichenketten sind unveränderlich. Sie können nicht geändert werden. Sie müssen eine neue Zeichenkette mit dem geänderten Inhalt erstellen. Wenn Sie jedes 'j' in Großbuchstaben schreiben wollen:

def make_uppercase_j(char):
    if char == 'j':
        return 'J'
    else:
        return char
name = "markus johansson"
''.join(make_uppercase_j(c) for c in name)

0 Stimmen

''.join('J' if c == 'j' else c for c in name)

2voto

kender Punkte 82504

Wenn Sie nach einer allgemeineren Lösung für Namen suchen, sollten Sie sich auch die folgenden Beispiele ansehen:

  • John Adams-Schmidt
  • Jeanne d'Arc
  • Jean-Luc de'Breu
  • Donatien Alphonse François de Sade

Außerdem sollten einige Teile der Namen nicht mit Großbuchstaben beginnen, z. B.:

  • Herbert von Locke
  • Sander van Dorn
  • Edwin van der Sad

Wenn Sie also eine allgemeinere Lösung anstreben, sollten Sie all diese kleinen Dinge im Auge behalten.

(Dies wäre ein idealer Ort, um eine testgetriebene Entwicklung durchzuführen, mit all den Bedingungen, die Ihre Methode/Funktion erfüllen muss) .

1 Stimmen

Dies ist nicht der Ort für testgetriebene Entwicklung - dies ist der Ort, um Ihren Prozess zu überprüfen und herauszufinden, warum die Namen alle in Kleinbuchstaben eingegeben werden, und dies zu ändern, so dass Sie keinen Post-Hoc-Code benötigen. Selbst mit Post-Hoc-Code sollten Sie sicherstellen, dass cualquier Mehrdeutigkeit wird von Menschen aufgelöst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X