Pythonische Möglichkeit, Komma getrennte Zahlen in Paare zu teilen

Ich möchte einen kommagetrennten Wert in Paare teilen:

>>> s = '0,1,2,3,4,5,6,7,8,9' >>> pairs = # something pythonic >>> pairs [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)] 

Was würde mal etwas pythonisch aussehen?

  • Schließen Sie die Multi-Thread-Anwendung mit KeyboardInterrupt
  • Python-Regex mit Blick hinter und Alternativen
  • Wie können wir herausfinden, warum bestimmte uuencodierte Dateien mit Python nicht richtig dekodieren?
  • Verschieben Sie eine Liste
  • HDF5 - Gleichzeitigkeit, Kompression & E / A-Leistung
  • Python - Flask: render_template () nicht gefunden [duplizieren]
  • Wie würden Sie einen String mit einem ungeraden Satz von Zahlen erkennen und behandeln?

  • Importieren Sie eine CSV-Datei in Oracle mit CX_Oracle & Python 2.7
  • Wie benutzt man TensorFlow im OOP-Stil?
  • Ändern von XML-Dateien mit python
  • Auswählen der eingebetteten Skriptsprache für C ++
  • Wie kann ich ein Binär-Array als Bild in Python schreiben?
  • Networkx grafische Suche: dfs_successors vs. dfs_predecessors
  • 5 Solutions collect form web for “Pythonische Möglichkeit, Komma getrennte Zahlen in Paare zu teilen”

    Etwas wie:

     zip(t[::2], t[1::2]) 

    Volles Beispiel:

     >>> s = ','.join(str(i) for i in range(10)) >>> s '0,1,2,3,4,5,6,7,8,9' >>> t = [int(i) for i in s.split(',')] >>> t [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> p = zip(t[::2], t[1::2]) >>> p [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)] >>> 

    Wenn die Anzahl der Elemente ungerade ist, wird das letzte Element ignoriert. Es werden nur komplette Paare aufgenommen.

    Eine allgemeinere Option, die auch auf Iteratoren arbeitet und erlaubt es, beliebig viele Elemente zu kombinieren:

      def n_wise(seq, n): return zip(*([iter(seq)]*n)) 

    Ersetzen Sie den Zip mit itertools.izip, wenn Sie einen faulen Iterator anstelle einer Liste bekommen möchten.

    Wie wäre es damit:

     >>> x = '0,1,2,3,4,5,6,7,8,9'.split(',') >>> def chunker(seq, size): ... return (tuple(seq[pos:pos + size]) for pos in xrange(0, len(seq), size)) ... >>> list(chunker(x, 2)) [('0', '1'), ('2', '3'), ('4', '5'), ('6', '7'), ('8', '9')] 

    Dies wird auch schön ungleiche Beträge behandeln:

     >>> x = '0,1,2,3,4,5,6,7,8,9,10'.split(',') >>> list(chunker(x, 2)) [('0', '1'), ('2', '3'), ('4', '5'), ('6', '7'), ('8', '9'), ('10',)] 

    PS Ich hatte diesen Code verstaut und ich habe gerade festgestellt, woher ich davon gekommen bin. Es gibt zwei sehr ähnliche Fragen im Stackoverflow:

    • Was ist der "pythonische" Weg, um über eine Liste in Brocken zu iterieren?
    • Wie hast du eine Liste in gleichmäßig sortierte Chunks in Python gespalten?

    Es gibt auch dieses Juwel aus dem Rezept- Bereich von itertools :

     def grouper(n, iterable, fillvalue=None): "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n return izip_longest(fillvalue=fillvalue, *args) 

    Eine Lösung wie FogleBirds, aber mit einem Iterator (ein Generatorausdruck) anstelle von Listenverständnis.

     s = '0,1,2,3,4,5,6,7,8,9' # generator expression creating an iterator yielding numbers iterator = (int(i) for i in s.split(',')) # use zip to create pairs # (will ignore last item if odd number of items) # Note that zip() returns a list in Python 2.x, # in Python 3 it returns an iterator pairs = zip(iterator, iterator) 

    Beide Listenverständnisse und Generatorausdrücke würden wahrscheinlich als ganz "pythonisch" betrachtet.

    Dies ignoriert die letzte Zahl in einer ungeraden Liste:

     n = [int(x) for x in s.split(',')] print zip(n[::2], n[1::2]) 

    Dies wird die kürzere Liste durch 0 in einer ungeraden Liste:

     import itertools n = [int(x) for x in s.split(',')] print list(itertools.izip_longest(n[::2], n[1::2], fillvalue=0)) 

    Izip_longest ist in Python 2.6 verfügbar.

    Python ist die beste Programmiersprache der Welt.