it-swarm.com.de

Wie bekomme ich alle zusammenhängenden Substrate eines Strings in Python?

Hier ist mein Code, aber ich möchte eine bessere Lösung. Wie denken Sie über das Problem?

def get_all_substrings(string):
  length = len(string)
  alist = []
  for i in xrange(length):
    for j in xrange(i,length):
      alist.append(string[i:j + 1]) 
  return alist

print get_all_substring('abcde')
27
lqhcpsgbl

Die einzige Verbesserung, die ich mir vorstellen kann, ist das Listenverständnis so zu verwenden

def get_all_substrings(input_string):
  length = len(input_string)
  return [input_string[i:j+1] for i in xrange(length) for j in xrange(i,length)]

print get_all_substrings('abcde')

Der Timing-Vergleich zwischen dir und mir

def get_all_substrings(string):
  length = len(string)
  alist = []
  for i in xrange(length):
    for j in xrange(i,length):
      alist.append(string[i:j + 1]) 
  return alist

def get_all_substrings_1(input_string):
  length = len(input_string)
  return [input_string[i:j + 1] for i in xrange(length) for j in xrange(i,length)]

from timeit import timeit
print timeit("get_all_substrings('abcde')", "from __main__ import get_all_substrings")
# 3.33308315277
print timeit("get_all_substrings_1('abcde')", "from __main__ import get_all_substrings_1")
# 2.67816185951
33
thefourtheye

Sie können es als Generator schreiben, um das Speichern aller Zeichenfolgen auf einmal zu speichern, wenn Sie dies nicht benötigen

def get_all_substrings(string):
    length = len(string)
    for i in xrange(length):
        for j in xrange(i + 1, length + 1):
            yield(string[i:j]) 

for i in get_all_substrings("abcde"):
    print i

sie können immer noch eine Liste erstellen, wenn Sie wirklich eine benötigen

alist = list(get_all_substrings("abcde"))

Die Funktion kann reduziert werden, um einen Generatorausdruck zurückzugeben

def get_all_substrings(s):
    length = len(s)
    return (s[i: j] for i in xrange(length) for j in xrange(i + 1, length + 1))

Sie können natürlich auch zwei Zeichen ändern, um eine Liste anzuzeigen, wenn Sie sich nicht um Speicher kümmern

def get_all_substrings(s):
    length = len(s)
    return [s[i: j] for i in xrange(length) for j in xrange(i + 1, length + 1)]
5
John La Rooy

Ich habe range(len(seq)) noch nie geliebt. Wie wäre es mit Enumerate und nur mit dem Indexwert:

def indexes(seq, start=0):
    return (i for i,_ in enumerate(seq, start=start))

def gen_all_substrings(s):
    return (s[i:j] for i in indexes(s) for j in indexes(s[i:], i+1))

def get_all_substrings(string):
    return list(gen_all_substrings(string))

print(get_all_substrings('abcde'))
5
PaulMcG

Python 3

s='abc'
list(s[i:j+1] for i in range (len(s)) for j in range(i,len(s)))

['a', 'ab', 'abc', 'b', 'bc', 'c']
0
user4043951

Verwenden Sie itertools.permutations, um alle Paare möglicher Start- und Endindizes zu generieren, Und filtern Sie nur diejenigen heraus, deren Startindex kleiner als der Endindex ist. Dann verwendet Diese Paare, um Slices des ursprünglichen Strings zurückzugeben.

from itertools import permutations

def gen_all_substrings(s):
    lt = lambda pair: pair[0] < pair[1]
    index_pairs = filter(lt, permutations(range(len(s)+1), 2))
    return (s[i:j] for i,j in index_pairs)

def get_all_substrings(s):
    return list(gen_all_substrings(s))

print(get_all_substrings('abcde'))
0
PaulMcG

kann mit itertools.combinations präzise gemacht werden

from itertools import combinations

def get_all_substrings_2(string):
    length = len(string) + 1
    return [string[x:y] for x, y in combinations(range(length), r=2)]
0
DyRuss

Eine andere Lösung mit 2-D-Matrix-Ansatz

p = "abc"
a = list(p)
b = list(p)
c = list(p)
count = 0
for i in range(0,len(a)):
       dump = a[i]
            for j in range(0, len(b)):
                if i < j:
                    c.append(dump+b[j])
                    dump = dump + b[j]  
0
Nkromin989

Eine andere Lösung: 

def get_all_substrings(string):
   length = len(string)+1
   return [string[x:y] for x in range(length) for y in range(length) if string[x:y]]

print get_all_substring('abcde')
0
sanooj