Gib alle möglichen Kombinationen eines Strings zurück, wenn er in n Strings aufgeteilt ist

Ich habe eine Suche nach Stackoverflow über diese, aber konnte nicht finden, einen Weg, es zu tun. Es handelt sich wahrscheinlich um itertools.

Ich möchte alle möglichen Ergebnisse der Spaltung einer Zeichenfolge finden, sagen die String thisisateststring in n (gleiche oder ungleiche Länge, spielt keine Rolle, beide sollten enthalten sein) Strings.

Zum Beispiel sei n 3 :

 [["thisisat", "eststrin", "g"], ["th", "isisates", "tstring"], ............] 

3 Solutions collect form web for “Gib alle möglichen Kombinationen eines Strings zurück, wenn er in n Strings aufgeteilt ist”

Einschließlich leere Zeichenfolgen in Ihre Ergebnisse werden ziemlich umständlich mit itertools.combinations() . Es ist wahrscheinlich am einfachsten, deine eigene rekursive Version zu schreiben:

 def partitions(s, k): if not k: yield [s] return for i in range(len(s) + 1): for tail in partitions(s[i:], k - 1): yield [s[:i]] + tail 

Dies wird für jede beliebige Anzahl k der gewünschten Partitionen für jeden String s funktionieren.

Sie können hier itertools.combinations . Sie müssen einfach zwei Splitting Punkte, um jede resultierende Zeichenfolge zu generieren:

 from itertools import combinations s = "thisisateststring" pools = range(1, len(s)) res = [[s[:p], s[p:q], s[q:]] for p, q in combinations(pools, 2)] print res[0] print res[-1] 

Ausgabe:

 ['t', 'h', 'isisateststring'] ['thisisateststri', 'n', 'g'] 

Hier ist ein Rezept für die Partitionierung einer Sequenz in n Gruppen, basierend auf Code von Raymond Hettinger :

 import itertools as IT def partition_into_n(iterable, n, chain=IT.chain, map=map): """ Based on http://code.activestate.com/recipes/576795/ (Raymond Hettinger) Modified to include empty partitions, and restricted to partitions of length n """ s = iterable if hasattr(iterable, '__getslice__') else tuple(iterable) m = len(s) first, middle, last = [0], range(m + 1), [m] getslice = s.__getslice__ return (map(getslice, chain(first, div), chain(div, last)) for div in IT.combinations_with_replacement(middle, n - 1)) 

 In [149]: list(partition_into_n(s, 3)) Out[149]: [['', '', 'thisisateststring'], ['', 't', 'hisisateststring'], ['', 'th', 'isisateststring'], ['', 'thi', 'sisateststring'], ... ['thisisateststrin', '', 'g'], ['thisisateststrin', 'g', ''], ['thisisateststring', '', '']] 

Es ist langsamer als die rekursive Lösung für kleine n ,

 def partitions_recursive(s, n): if not n>1: yield [s] return for i in range(len(s) + 1): for tail in partitions_recursive(s[i:], n - 1): yield [s[:i]] + tail s = "thisisateststring" In [150]: %timeit list(partition_into_n(s, 3)) 1000 loops, best of 3: 354 µs per loop In [151]: %timeit list(partitions_recursive(s, 3)) 10000 loops, best of 3: 180 µs per loop 

Aber wie Sie vielleicht erwarten, ist es schneller für große n (wie die Rekursionstiefe erhöht):

 In [152]: %timeit list(partition_into_n(s, 10)) 1 loops, best of 3: 9.2 s per loop In [153]: %timeit list(partitions_recursive(s, 10)) 1 loops, best of 3: 10.2 s per loop 
  • Umwandlung eines Strings in eine Liste von Tupeln
  • Warum ist '\ x' in Python ungültig?
  • Python-Funktion, um String zwischen zwei Markern zu finden
  • Eine Liste von String-Ersetzungen in Python
  • Python - Überprüfen Sie, ob die letzten Zeichen in einem String Zahlen sind
  • String Ersatzkombinationen
  • Aufteilen einer variablen Länge String in mehrere Teile in Python
  • Poker Hand String Display
  • Pythons "Re" -Modul funktioniert nicht?
  • Was bedeutet ein führender `\ x` in einer Python-Zeichenfolge` \ xaa`
  • Wie kann ich doppelte Wörter in einem String mit Python entfernen?
  • Python ist die beste Programmiersprache der Welt.