0

I have a string "BANANA". I would like to generate a list of all possible sequential substrings:

[B, BA, BAN, BANA, BANAN, BANANA, A, AN, ANA, ...]

Is this something I can accomplish using a Python List Comprehension or would I just generate them in a brute force manner? Note: I am new to Python. TIA

RobertJoseph
  • 7,968
  • 12
  • 68
  • 113

3 Answers3

2

Using list Comprehension:

s = "BANANA"
l = len(s)
ar = [s[j:] for i in range(l) for j in range(i,l)]
print(*ar)

Using nested loop:

s = "BANANA"
l = len(s)
ar = []
for i in range(l):
    for j in range(i,l):
        ar.append(s[j:])
print(*ar)

Both output:

BANANA ANANA NANA ANA NA A ANANA NANA ANA NA A NANA ANA NA A ANA NA A NA A A

N.B.: The itertools has already been explained in A.J.'s answer.

arshovon
  • 13,270
  • 9
  • 51
  • 69
1

Try the following with itertools:

str = "BANANA"
all = [[''.join(j) for j in itertools.product(str, repeat=i)] for i in range(1, len(str)+1)]

>>> all[0]
['B', 'A', 'N', 'A', 'N', 'A']
>>> all[1]
['BB', 'BA', 'BN', 'BA', 'BN', 'BA', 'AB', 'AA', 'AN', 'AA', 'AN', 'AA', 'NB', 'NA', 'NN', 'NA', 'NN', 'NA', 'AB', 'AA', 'AN', 'AA', 'AN', 'AA', 'NB', 'NA', 'NN', 'NA', 'NN', 'NA', 'AB', 'AA', 'AN', 'AA', 'AN', 'AA']
>>> 
A.J. Uppal
  • 19,117
  • 6
  • 45
  • 76
1

If you want all the posible sublist, you can use two for in one list comprehension:

def sublists(lst):
    return [lst[m:n+1] for m in range(0,len(lst)+1) for n in range(m,len(lst)+1)]

  sublists("banana")
=> ['b', 'ba', 'ban', 'bana', 'banan', 'banana', 'banana', 'a', 'an', 'ana', 'anan', 'anana', 'anana', 'n', 'na', 'nan', 'nana', 'nana', 'a', 'an', 'ana', 'ana', 'n', 'na', 'na', 'a', 'a', '']

if you dont want repeated elements:

def sublistsWithoutRepeated(lst):
  return list(set(sublists(lst)))

  sublistsWithoutRepeated("banana")
=> ['a', '', 'b', 'ba', 'nana', 'na', 'nan', 'an', 'anana', 'anan', 'n', 'bana', 'ban', 'banan', 'banana', 'ana']
developer_hatch
  • 15,898
  • 3
  • 42
  • 75