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 
  • Python-String in Liste umwandeln [duplizieren]
  • Was ist unter der Kapuze von x = 'y' 'z' in Python?
  • Python: finding substring innerhalb einer liste
  • C ++ String-Parsing (Python-Stil)
  • Holen Sie sich die erste nicht leere Zeichenfolge aus einer Liste in Python
  • Ersetzen von Variablennamen in String mit Werten aus der Liste und Vermeidung von redundanten Ersetzungen
  • Ist die python dict str () Funktion zuverlässig sortieren Schlüssel?
  • Finden Sie alle möglichen Permutationen eines gegebenen Strings in Python
  • Extrahieren Sie String zwischen den Zitaten
  • Wie prüft man, ob Typ einer Variable String ist?
  • Wie man das erste Zeichen einer Zeichenfolge in Python herunterschiebt?
  • Python ist die beste Programmiersprache der Welt.