Home > database >  String manipulation with python and storing alphabets and digits in separate lists
String manipulation with python and storing alphabets and digits in separate lists

Time:02-26

For a given string s='ab12dc3e6' I want to add 'ab' and '12' in two different lists. that means for output i am trying to achieve as temp1=['ab','dc','e'] and for temp2=['12,'3','6']. I am not able to do so with the following code. Can someone provide an efficient way to do it?

S = "ab12dc3e6"
temp=list(S)
x=''
temp1=[]
temp2=[]
for i in range(len(temp)):
    while i<len(temp) and (temp[i] and temp[i 1]).isdigit():
        x =temp[i]
        i =1
        temp1.append(x)
        if not temp[i].isdigit():
            break

CodePudding user response:

you can use regex, where you group letters and digits, then append them to lists

import re
S = "ab12dc3e6"

pattern = re.compile(r"([a-zA-Z]*)(\d*)")

temp1 = []
temp2 = []
for match in pattern.finditer(S):
    # extract words
    #dont append empty match
    if match.group(1):
        temp1.append(match.group(1))
        print(match.group(1))
    # extract numbers
    #dont append empty match
    if match.group(2):
        temp2.append(match.group(2))
        print(match.group(2))
print(temp1)
print(temp2)

CodePudding user response:

Your code does nothing for isalpha - you also run into IndexError on

while i<len(temp) and (temp[i] and temp[i 1]).isdigit():

for i == len(temp)-1.


You can use itertools.takewhile and the correct string methods of str.isdigit and str.isalpha to filter your string down:

S = "ab12dc3e6"

r = {"digit":[], "letter":[]}

from itertools import takewhile, cycle

# switch between the two test methods
c = cycle([str.isalpha, str.isdigit])

r = {}
i = 0
while S:
    what = next(c) # get next method to use
    k = ''.join(takewhile(what, S))
    S = S[len(k):]
    r.setdefault(what.__name__, []).append(k)

print(r)

Output:

{'isalpha': ['ab', 'dc', 'e'], 
 'isdigit': ['12', '3', '6']}

This essentially creates a dictionary where each seperate list is stored under the functions name:

To get the lists, use r["isalpha"] or r["isdigit"].

  • Related