python list - Che cosa fa esattamente il metodo.join()?




string with (6)

Sono abbastanza nuovo per Python e sono completamente confuso da .join() che ho letto è il metodo preferito per concatenare le stringhe.

Provai:

strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring().join(strid)

e ottenuto qualcosa come:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

Perché funziona così? Non dovrebbe essere aggiunto automaticamente il 595 ?


Answers

Guarda attentamente il tuo risultato:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5
^                 ^                 ^

Ho evidenziato il "5", "9", "5" della tua stringa originale. Il metodo join() Python è un metodo stringa e prende un elenco di cose da unire alla stringa. Un esempio più semplice potrebbe aiutare a spiegare:

>>> ",".join(["a", "b", "c"])
'a,b,c'

Il "," è inserito tra ogni elemento della lista data. Nel tuo caso, la tua "lista" è la rappresentazione della stringa "595", che viene considerata come la lista ["5", "9", "5"].

Sembra che tu stia cercando + invece:

print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid

Fornendo questo come input,

li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
s = ";".join(li)
print(s)

Python restituisce questo come output:

'server=mpilgrim;uid=sa;database=master;pwd=secret'

join prende una cosa iterable come argomento. Di solito è una lista. Il problema nel tuo caso è che una stringa è essa stessa iterabile, dando a turno ogni personaggio. Il tuo codice si riduce a questo:

"wlfgALGbXOahekxSs".join("595")

che agisce come questo:

"wlfgALGbXOahekxSs".join(["5", "9", "5"])

e così produce la tua stringa:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

Stringhe come iterabili è uno dei problemi iniziali più confusi con Python.


Per aggiungere una stringa, basta concatenarla con il segno + .

Per esempio

>>> a = "Hello, "
>>> b = "world"
>>> str = a + b
>>> print str
Hello, world

join unisce le stringhe insieme a un separatore. Il separatore è ciò che posiziona prima del join . Per esempio

>>> "-".join([a,b])
'Hello, -world'

Join prende un elenco di stringhe come parametro.


join () è per concatenare tutti gli elementi della lista. Per concatenare solo due stringhe "+" avrebbe più senso:

strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring() + strid

Nuova risposta dopo 6 anni e 5 mesi (procrastinazione).

Mentre stringè una parola chiave C # riservata che ha sempre un significato fisso, Stringè solo un identificatore ordinario che potrebbe riferirsi a qualsiasi cosa. A seconda dei membri del tipo corrente, lo spazio dei nomi corrente e le usingdirettive applicate e il loro posizionamento Stringpotrebbero essere un valore o un tipo distinto da global::System.String.

Fornirò due esempi in cui le usingdirettive non aiuteranno .

Innanzitutto, quando Stringè un valore del tipo corrente (o una variabile locale):

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

Quanto sopra non verrà compilato perché IEnumerable<>non è stato chiamato un membro non statico Formate non vengono applicati metodi di estensione. Nel caso precedente, potrebbe essere ancora possibile utilizzare Stringin altri contesti in cui un tipo è l'unica possibilità sintatticamente. Ad esempio String local = "Hi mum!";potrebbe essere OK (a seconda del namespace e delle usingdirettive).

Peggio: dire String.Concat(someSequence)probabilmente sarà (a seconda di using) andare al metodo di estensione Linq Enumerable.Concat. Non andrà al metodo statico string.Concat.

In secondo luogo, quando Stringè un altro tipo , annidato all'interno del tipo corrente:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Nessuna delle due istruzioni nel Examplemetodo compila. Qui Stringè sempre un pianoforte string , MyPiano.String. Nessun membro ( statico non) Formatesiste su di esso (o è ereditato dalla sua classe base). E il valore "Goodbye"non può essere convertito in esso.





python list string