Перебор фильтра вложенных списков

#python #list #filter #nested

#python #Список #Фильтр #вложенный

Вопрос:

Извините, если название неверно, я новичок в этом и самостоятельно изучаю Python. У меня есть текущая программа, которая включает это…

     # Prompt function List
    whatIsYourNameL = ['my name is','i am called', 'you may call me']
    # Do this is if prompted
    def whatIsYourName()
        print(f'Hello {youName}')

    while True:

        if list(filter(lambda x: x in choice.lower(), changeYourNameList)):
            changeYourName()
        elif list(filter(lambda x: x in choice.lower(), whatIsYourNameList)):
            whatIsYourName()
        elif list(filter(lambda x: x in choice.lower(), whatIsMyNameList)):
            whatIsMyName()
  

До сих пор я использовал тот же фильтр во вложенном операторе if — elif и менял имена функций. Сейчас я пытаюсь упростить, пытаясь сделать что-то подобное…

      # Prompt function List
     whatIsYourNameL = ['my name is','i am called', 'you may call me']
     # Do this is if prompted
     def whatIsYourName()
        print(f'Hello {youName}')

     FunctList = ['changeYourName','whatIsYourName','whatIsMyName']
     c = choice.lower
     while True:    
    
        for funct in range(len(FunctList)):
            if list(filter(lambda x: x in c, f'{FunctList[funct]}L')):
                f'{FunctList[funct]}()'
  

Есть идеи, как я могу это сделать?

Комментарии:

1. Что c в вашем коде?

2. Можете ли вы сохранить фактические функции (т. Е. Удалить кавычки) в FuncList определении? Это сделало бы проблему почти тривиальной

Ответ №1:

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

 def changeYourName():
    print("change your name")

def whatIsYourName():
    print("what is your name?")

def whatIsMyName():
    print("what is my name?")

FunctList = [changeYourName, whatIsYourName, whatIsMyName]

for f in FunctList:
    f()
  

Обратите внимание, что в список попадают сами функции, а не строки, соответствующие их именам. Когда вы перебираете содержимое этого списка с for f in FunctList помощью , каждый элемент ( f ) является функцией, которую вы можете вызвать, т.е. f() .

(редактировать)

Просматривая ваш обновленный вопрос, похоже, что вы пытаетесь связать список префиксов с каждой функцией, а затем вызвать функцию, соответствующую префиксу? Вот как я мог бы это сделать — поскольку вы хотите не только проверить соответствие, но, предположительно, также удалить префикс (ваш код не определяет значение youName , но в зависимости от контекста кажется, что вы хотите извлечь его из строки «меня зовут»), имеет смыслмне нужно поместить всю эту логику в одну функцию, чтобы вам не приходилось обрабатывать префикс в двух разных местах:

 from typing import Callable, Iterable


def strip_prefix_and_call(
    prefixes: Iterable[str],
    func: Callable[[str], None],
    arg: str
) -> None:
    """Given an arg that starts with one of a set of prefixes,
    strip the prefix from the arg and invoke the given func.
    Raises ValueError if none of the prefixes is in the arg."""
    try:
        prefix = [p for p in prefixes if arg.lower().startswith(p)][0]
        func(arg[len(prefix):])
    except IndexError:
        raise ValueError(f"{arg} does not start with any prefix in {prefixes}")


def my_name_is(name: str):
    print(f"Hello {name}")


def do_this_thing(command: str):
    print(f"I don't know how to {command}")


while True:
    choice = input("? ")

    for prefixes, func in [
        (['my name is ', 'i am called ', 'you may call me '], my_name_is),
        (['please ', 'i order you to ', 'would you kindly '], do_this_thing),
    ]:
        try:
            strip_prefix_and_call(prefixes, func, choice)
            break
        except ValueError:
            continue
  
 ? My name is Bob
Hello Bob
? Would you kindly assemble a martini
I don't know how to assemble a martini
  

Комментарии:

1. «c» — это строка, написанная пользователем, например, «Меня зовут Дэвид» или «Они называют меня Дэвидом». Исходная функция просмотрела список с именем «whatIsYourNameL» и в этом списке нашла соответствующую подстроку «c», а затем запустила функцию «whatIsYourName ()»

2. Где в него входят другие функции? Было бы полезно, если бы мы могли видеть код целиком и иметь некоторое объяснение общей цели; невозможно выполнить триангуляцию цели, когда нет ни кода, ни документации. 🙂

3. В моем исходном коде фильтр был одним из многих, каждый из которых находился внутри вложенного оператора if else . Итак, если фильтр не нашел подстроку c в своем списке, он перейдет к следующему elif и посмотрит, может ли подстрока c быть в его списке, и вызовет эту функцию вместо этого

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

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