Как вернуть последнюю строку в списке, который заканчивается на di git в списке из списка строк? - PullRequest
1 голос
/ 06 апреля 2020

Итак, у меня есть список из списка строк. Например:

[[['F0','K4','N']], [['S', 'B2', 'A5']]]

Я хотел бы вернуть список строк, который содержит последний элемент в каждом подсписке, заканчивающийся ди git. Так что это должно дать мне результат:

['K4','A5']

Вот что я пробовал:

result = []
    for line in poem_pronunciation:
        for words in line:
            for i,unit in reversed(list(enumerate(words))):
                if unit[-1] in '0123456789':
                    result.append(words[i])
    return result

Это даст мне результат

['K4', 'F0', 'A5', 'B2']

По-видимому, он включает в себя все строки, которые заканчиваются на di git и в обратном порядке. Как это исправить? Любая помощь будет оценена.

Ответы [ 4 ]

3 голосов
/ 06 апреля 2020

При добавлении элемента вы можете остановить l oop с помощью break

def getLasts(poem_pronunciation):
    result = []
    for line in poem_pronunciation:
        for words in line:
            for i, unit in reversed(list(enumerate(words))):
                if unit[-1] in '0123456789':
                    result.append(words[i])
                    break
    return result

Если вы хотите упростить третий вид, посмотрите на него по-другому

  • собрать элементы, заканчивающиеся цифрами
  • , прочитав в обратном порядке, и взять первое, используя next(), чтобы получить первый элемент итератора

    for line in poem_pronunciation:
        for words in line:
            result.append(next(x for x in words[::-1] if x[-1].isdigit()))
    

Упрощение всего лишь вопрос понимания списка

def getLasts(poem_pronunciation):
    return [next(x for x in words[::-1] if x[-1].isdigit())
            for line in poem_pronunciation
            for words in line]
2 голосов
/ 06 апреля 2020

Вы можете использовать следующее вложенное понимание:

l = [[['F0','K4','N']], [['S', 'B2', 'A5']]]

[next(x for x in s2[::-1] if x[-1].isdigit()) for s1 in l for s2 in s1]
# ['K4', 'A5']
0 голосов
/ 06 апреля 2020

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

Сначала я создал две функции ends_with_digit(), которая проверяет, заканчивается ли строка числом или не используя int функцию внутри оператора try.

def ends_with_digit(string):
    try:
        int(string[-1])
    except ValueError:
        return False
    return True

тогда, Вам нужна функция, которая возвращает последние элементы. Поскольку у вас есть 3d list, вам нужно три цикла, чтобы выполнить sh задачу. после того, как вы проверите элемент, вы должны остановить l oop, если оператор равен True, чтобы последний l oop не продолжал добавлять все элементы.

def last_digit_items(list):
    out = []
    for sub1 in list:
        for sub2 in sub1:
            for sub3 in reversed(sub2):
                if ends_with_digit(sub3):
                    out.append(sub3)
                    break
    return out

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

для проверки функции запустите следующий оператор печати

print(last_digit_items([[['F0','K4','N']], [['S', 'B2', 'A5']]]))

и он возвращает:

['K4', 'A5']
0 голосов
/ 06 апреля 2020

Когда сталкиваются с проблемой, обычно лучше разбить ее на части и создать для нее абстракции. В частности, для этого случая у вас есть две части:

  1. Перебор данных
  2. Для заданного списка элементов найдите последний элемент, в котором в качестве последнего символа используется di git.

Для 2 вы можете создать одну из следующих функций:

def last(lst):
    """Returns the las element in a list that the last character is a list"""
    return next((e for e in reversed(lst) if e[-1].isdigit()), '')

Убедитесь, что она работает:

print(last(['F0', 'K4', 'N']))

Вывод

K4

Теперь 1 относительно прост, и его можно сделать так:

result = []
for lines in poem:
    for words in lines:
        result.append(last(words))
print(result)

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

poem = [[['F0', 'K4', 'N']], [['S', 'B2', 'A5']]]


def last(lst):
    """Returns the las element in a list that the last character is a list"""
    return next((e for e in reversed(lst) if e[-1].isdigit()), '')


result = [last(words) for lines in poem for words in lines]

print(result)

Выход

['K4', 'A5']

Важно, когда лицо с Проблема: попытайтесь разделить его на части, создайте абстракции для этих частей и соедините их вместе в качестве последнего шага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...