может кто-нибудь, пожалуйста, объяснить эту строку кода?

#python #arrays #list-comprehension

Вопрос:

Идея этого состоит в том, чтобы получить любое имя из nombres этого начала с любой буквы, которая задана padron и сохранить его в nombres_filtrados (что я не могу понять). Я был бы очень признателен за помощь!

     padron = ['A', 'E', 'J', 'T']

    nombres = ['Tamara', 'Marcelo', 'Martin', 'Juan', 'Alberto', 'Exequiel',
               'Alejandro', 'Leonel', 'Antonio', 'Omar', 'Antonia', 'Amalia',
               'Daniela', 'Sofia', 'Celeste', 'Ramon', 'Jorgelina', 'Anabela', "X"]
   
    nombres_filtrados = [x for x in nombres if any(f in x for f in padron)]

    print(nombres_filtrados)
 

Спасибо!

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

1. Этот код не выполняет то, что вы намереваетесь. Он добавит любое слово, в nombres котором есть хотя бы один из символов padron in .

2. Это совпадение, потому что все ваши имена начинаются с заглавных букв. Если бы у вас был, например "CELESTE" , в вашем nombres списке, он тоже был бы выбран. Правильная реализация была бы такой [x for x in nombres if x[0].upper() in padron] .

3. Это работает только потому padron , что содержит все заглавные буквы, а единственные символы с заглавными буквами — это первый символ. Не так, как должен быть написан код.

4. Из всех имен в этом списке, безусловно, самое крутое "X" . Если у меня есть еще один ребенок, я называю их X (и, конечно, со ссылкой на StackOverflow в их свидетельстве о рождении).

5. @paddy Убедитесь, что они стали профессором чего-то .

Ответ №1:

nombres_filtrados проверяет каждую букву в каждом имени по вашему списку padron, действительно ли это должно быть:

 padron = ['A', 'E', 'J', 'T']
nombres = ['Tamara', 'Marcelo', 'Martin', 'Juan', 'Alberto', 'Exequiel',
       'Alejandro', 'Leonel', 'Antonio', 'Omar', 'Antonia', 'Amalia',
       'Daniela', 'Sofia', 'Celeste', 'Ramon', 'Jorgelina', 'Anabela', "X",'eA']

nombres_filtrados = [x for x in nombres if any(f in x[0] for f in padron)]
print(nombres_filtrados)
 

В основном то, что делает nombres_filtrados, это:

 padron = ['A', 'E', 'J', 'T']
nombres = ['Tamara', 'Marcelo', 'Martin', 'Juan', 'Alberto', 'Exequiel',
       'Alejandro', 'Leonel', 'Antonio', 'Omar', 'Antonia', 'Amalia',
       'Daniela', 'Sofia', 'Celeste', 'Ramon', 'Jorgelina', 'Anabela', "X",'eA']

nombres_filtrados = [x for x in nombres if any(f in x[0] for f in padron)]


output = []
for name in nombres:        #For Each Name in Nombres
    if name[0] in padron:   #if the First Letter is In Padron
        output.append(name) #Save To Our Output

print(output)
 

Ответ №2:

Бесполезно проверять все буквы имен. Эффективным методом было бы сопоставление только первой буквы с набором:

 [name for name in nombres
 if name[0].upper() in set(padron)]
 

Вывод:

 ['Tamara',
 'Juan',
 'Alberto',
 'Exequiel',
 'Alejandro',
 'Antonio',
 'Antonia',
 'Amalia',
 'Jorgelina',
 'Anabela']