Найти индекс строки в списке на основе части строки

1

У меня есть список:

foolist = ['123-asd', '234-asd', '345-asd']

Я хочу найти индекс строки, которая содержит "234". На данный момент у меня есть это:

boollist = ['234' in i for i in foolist]

который создаст список True и Falses для каждого индекса для foolist.

Затем, чтобы найти индекс, [print(i) for i,j in enumerate(foolist) if j==True]

Это кажется abit ненужным, у кого-то есть более красноречивый метод поиска индекса строки в списке на основе части этой строки

  • 2
    [i for i,j in enumerate(foolist) if '234' in j] ?
  • 1
    Да, это сработало, спасибо за это, Cheerws
Теги:
string
list
python-3.x

1 ответ

3
Лучший ответ

Вы можете использовать next с выражением генератора и разделить на определенный символ, чтобы отразить структуру ваших строк:

foolist = ['123-asd','234-asd','345-asd']

res = next(i for i, j in enumerate(foolist) if '123' in j.split('-')[0])  # 0

Если может быть несколько совпадений, вы можете использовать понимание списка:

res = [i for i, j in enumerate(foolist) if '123' in j.split('-')[0]]  # [0]

Для равенства вам следует j.split('-')[0]] == '123' использовать j.split('-')[0]] == '123'.

Примечание при печати в рамках понимания

Это хорошая практика, чтобы избежать print в понимании списка, так как она вернет None. Вы заметите, что, пока ваш терминал напечатает найденные индексы, вы также создаете список элементов None длина которых равна количеству совпадений. Для всех целей этот список не используется.

Если вы интересуетесь только печатью, вы можете использовать цикл for с выражением генератора:

for idx in (i for i, j in enumerate(foolist) if '123' in j.split('-')[0]):
    print(idx)
  • 1
    "... как это вернется Нет" Хотя я согласен, я думаю, что это не причина. Может быть совершенно нормально вызывать функции, возвращающие None в понимании списка, бит плохой практики использует понимание списка для побочных эффектов и отбрасывает результат.
  • 0
    @tobias_k, спасибо, это то, что я имел в виду , но вы описали это более красноречиво. Я обновлю немного больше :)
Показать ещё 2 комментария

Ещё вопросы

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