Mfreeman
Mfreeman

Reputation: 3958

Find and replace strings in a list efficiently Python

I am currently bringing a list down from an api and changing the names based on severity levels

Right now my code to do this is

priname = list((item['fields']['priority']['name']) for item in data['issues'])
priname = [w.replace('Trivial', 'Low')
            .replace('Minor', 'Low')
            .replace('Moderate', 'Medium')
            .replace('Major', 'High')
            .replace('Critical', 'High')
            .replace('Blocker', 'Emergency')for w in priname]

So I am just replacing strings in the list to keywords that generalize the content. When I do this to larger lists, it takes forever to return the altered list which i realize means this is not an efficient way of doing this at all.

Can anyone point me in a direction where i can streamline this find and replace?

EDIT:

Priname=[
'Critical',
'Moderate',
'Major',
'Moderate',
'Moderate', 
'Critical', 
'Moderate', 
'Moderate', 
'Moderate', 
'Blocker', 
'Critical', 
'Moderate', 
'Moderate', 
'Major', 
'Moderate', 
'Critical'
]

Upvotes: 1

Views: 432

Answers (3)

rahlf23
rahlf23

Reputation: 9019

You can use a dictionary and assign multiple values for each key:

replacements = {'Low': ['Trivial','Minor'], 'Medium': ['Moderate'], 'High': ['Major','Critical'], 'Emergency': ['Blocker']}

Priname=['Critical','Moderate','Major','Moderate','Moderate', 'Critical', 'Moderate', 'Moderate',
'Moderate', 'Blocker', 'Critical', 'Moderate', 'Moderate', 'Major', 'Moderate', 'Critical']

Priname = [k for i in Priname for k, v in replacements.items() if i in v]

Returns:

['High', 'Medium', 'High', 'Medium', 'Medium', 'High', 'Medium', 'Medium', 'Medium', 'Emergency', 'High', 'Medium', 'Medium', 'High', 'Medium', 'High']

Upvotes: 1

user10597469
user10597469

Reputation:

One idea that comes to mind is to, rather than using a for loop, convert the list into a numpy array and use the numpy.where function:

    w = numpy.array(w)
    ind = numpy.where(w==list_elements_you_are_looking_for)
    w[ind] = new_value

Upvotes: 1

Dani Mesejo
Dani Mesejo

Reputation: 61910

You could use a dictionary:

priname = [
    'Critical',
    'Moderate',
    'Major',
    'Moderate',
    'Moderate',
    'Critical',
    'Moderate',
    'Moderate',
    'Moderate',
    'Blocker',
    'Critical',
    'Moderate',
    'Moderate',
    'Major',
    'Moderate',
    'Critical'
]

table = {'Trivial': 'Low',
         'Minor': 'Low',
         'Moderate': 'Medium',
         'Major': 'High',
         'Critical': 'High',
         'Blocker': 'Emergency'}

result = [table[e] for e in priname]
print(result)

Output

['High', 'Medium', 'High', 'Medium', 'Medium', 'High', 'Medium', 'Medium', 'Medium', 'Emergency', 'High', 'Medium', 'Medium', 'High', 'Medium', 'High']

Upvotes: 6

Related Questions