Нужна помощь в переборе списка строк в Python в обратном порядке, как только найдена строка с номером, верните все до - PullRequest
0 голосов
/ 13 февраля 2019

Так что у меня возникли небольшие проблемы с выяснением, как именно это сделать.

У меня есть список строк, например ['HU', 'ASDF', 'AK2', 'AS0', 'FJ'], и я хочу перебрать список в обратном порядке, и первыйстрока, найденная с цифрой, я хочу вернуть все до и включая строку.

Так что для приведенного выше примера я бы хотел, чтобы он возвращал ["AS0", "FJ"].Это не обязательно должно быть наоборот, это просто самый простой способ сделать это.

Я до сих пор пробовал это, но безрезультатно:

def example(list):
    stringed = str(list)
    return stringed.split('0' or '1' or '2')[::-1]

Редактировать: Ответ от Остина работал отлично

lst = ['HU', 'ASDF', 'AK2', 'AS0', 'FJ']

for i, x in enumerate(reversed(lst)):
    if any(y.isdigit() for y in x):
        break

print(lst[len(lst)-i-1:])
# ['AS0', 'FJ']

Ответы [ 6 ]

0 голосов
/ 14 февраля 2019

Рекурсивный подход:

def tailtildigit(str_list):
    if any(c.isdigit() for c in str_list[-1]) or len(str_list) == 1:
        return [str_list[-1]]
    else:
        return tailtildigit(str_list[:-1]) + [str_list[-1]]

Идея состоит в том, чтобы вернуть последнюю строку, если найдена цифра, в противном случае вернуть результат функции, примененной к сокращенному на один список записей, плюс последнюю строку.

Результат:

tailtildigit(lst)
# ['AS0', 'FJ']

Кстати, ожидаете ли вы вернуть полный список, если строка no содержит какие-либо цифры?Потому что это именно то, что делают Остин и мое решение ...

lst2 = ['HU', 'ASDF', 'AK', 'AS', 'FJ']
tailtildigit(lst2)
# ['HU', 'ASDF', 'AK', 'AS', 'FJ']
0 голосов
/ 13 февраля 2019
  a = ['HU', 'ASDF', 'AK2', 'AS0', 'FJ']

for strs in reversed(a):
    if not strs.isalpha():
        print((a[a.index(strs):]))
        break  
0 голосов
/ 13 февраля 2019

Этот метод использует re, чтобы избежать зацикливания символов в каждой строке.

import re

list =  ['HU', 'ASDF', 'AK2', 'AS0', 'FJ']

# Loop over list backwards (list[::-1]) and enumerate each entry
for id, l in enumerate(list[::-1]):
    # If entry l contains a digit
    if re.search(r'\d', l):
        # Print all the values proceeding entry l
        print(list[len(list) - id - 1:])
        # Exit loop now we have the first entry with a number
        break
0 голосов
/ 13 февраля 2019

Используйте set intersection, чтобы проверить, есть ли число в строке.

l =  ['HU', 'ASDF', 'AK2', 'AS0', 'FJ']

for i in range(len(l)-1, -1, -1):
    if set('0123456789') & set(l[i]):
        print(l[i:])
        break
0 голосов
/ 13 февраля 2019

Используйте any() и isdigit().Выполните итерацию по списку в обратном порядке и прервитесь, как только мы найдем элемент, имеющий по крайней мере одну цифру.Используйте его индекс для нарезки исходного списка:

lst = ['HU', 'ASDF', 'AK2', 'AS0', 'FJ']

for i, x in enumerate(reversed(lst)):
    if any(y.isdigit() for y in x):
        break

print(lst[len(lst)-i-1:])
# ['AS0', 'FJ']
0 голосов
/ 13 февраля 2019

Попробуйте:

myList = ["0","1","2","3","4","5","6","7","8","9"]

i = len(myList) - 1
while i >= 0:
    if myList[i] == "5": # <-- the number im looking for
        print(myList[i:len(myList)])
    i-=1

Возвращает ['5', '6', '7', '8', '9']

...