Найти и заменить строки в списке эффективно Python

1

В настоящее время я собираю список из api и изменяю имена на основе уровней серьезности

Прямо сейчас мой код для этого

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]

Поэтому я просто заменяю строки в списке ключевыми словами, которые обобщают содержимое. Когда я делаю это для более крупных списков, навсегда требуется вернуть измененный список, который, как я понимаю, означает, что это не эффективный способ сделать это вообще.

Может ли кто-нибудь указать мне направление, в котором я могу упорядочить эту находку и заменить ее?

РЕДАКТИРОВАТЬ:

Priname=[
'Critical',
'Moderate',
'Major',
'Moderate',
'Moderate', 
'Critical', 
'Moderate', 
'Moderate', 
'Moderate', 
'Blocker', 
'Critical', 
'Moderate', 
'Moderate', 
'Major', 
'Moderate', 
'Critical'
]
  • 1
    Используйте list-comp ( [... for x in ...] ) вместо list() + генераторное выражение. Это больше Pythonic.
  • 0
    Можете ли вы опубликовать data или priname чтобы мы могли видеть, с чем мы работаем?
Показать ещё 3 комментария
Теги:

3 ответа

6

Вы можете использовать словарь:

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)

Выход

['High', 'Medium', 'High', 'Medium', 'Medium', 'High', 'Medium', 'Medium', 'Medium', 'Emergency', 'High', 'Medium', 'Medium', 'High', 'Medium', 'High']
  • 1
    Это предполагает, что в priname существует не более одной замены на элемент, и что элементы идеально соответствуют priname . Я думаю, что мы можем предположить, что учитывая структуру примера OP, так что +1
  • 1
    Кроме того, table.get(e, e) над table[e] будет возвращать исходную строку, если нет замены.
Показать ещё 1 комментарий
0

Вы можете использовать словарь и назначить несколько значений для каждого ключа:

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]

Возвращает:

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

Одна идея, которая приходит на ум, состоит в том, чтобы вместо использования цикла for преобразовать список в массив numpy и использовать функцию numpy.where:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню