2015-10-19 5 views
-1

В принципе, мне нужно создать функцию, в которой я ввожу два аргумента: , первая из которых является буквой (т.е. «i») второй, являющийся списком (т. Е. ['Trees', 'iron' 'cars', 'indian'])Вход для Python ForLoop

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

так для меня:

def match_first_letter(G, F): 
    for i in F: 
     if i.F[0] == G: 
      return F 

где G является первой буквой и F список

я получаю: AttributeError: 'ул' объект не имеет атрибута 'L'

Есть ли что-то конкретное, что я делаю неправильно?

+0

Что вы ожидаете 'i.F [0]' сделать? –

+3

Ваша ошибка не соответствует вашему коду. – vaultah

+0

Я ожидаю, что i.F [0] просмотрит каждый элемент в моем списке и вернет те элементы, которые удовлетворяют аргументу – SystemofaCode

ответ

2

Первый взгляд на линии:

for i in F: 

Здесь Вы можете получить доступ к одному элементу F через i в то время.

Итак, вы должны использовать i[0] (первая цифра i), а не i.F[0].

Во-вторых,

Вы возвращаете list, не соответствует стоимости.

Если вы исправите его, у вас останется только первое совпадение, даже если у вас есть несколько совпадений.

Это потому, что вы возвращаетесь сразу после первого матча.

Вы можете достичь ожидаемого результата с пониманием списка.

def match_first_letter(G, F): 
    return [i for i in F if i[0]==G] 
0

Прежде всего, вы можете лучше назвать переменные разумно. Вместо G и F, как насчет letter и strings? Ваш код, таким образом, это:

def match_first_letter(letter, strings): 
    for current_string in strings: 
     if current_string.strings[0] == letter: 
      return strings 

В этом случае ошибка, что вы уже видите вместо этого сказать AttributeError: 'str' object has no attribute 'strings'. Обратите внимание, что это соответствует команде current_string.strings.

current_string[0] - это то, что вы на самом деле хотите протестировать против соответствия letter, так как это первая буква строки current_string.

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

def match_first_letter(letter, strings): 
    matched_strings = [] 

    for current_string in strings: 
     if current_string[0] == letter: 
      matched_strings.append(current_string) 

    return matched_strings 

Python на самом деле есть нечто, называемое list comprehensions, который может сделать такого рода вещи гораздо легче.

def match_first_letter(letter, strings): 
    return [string_x for string_x in strings if string_x[0] == letter] 

Я бы порекомендовал читать по спискам в приведенной выше ссылке.

0

Поскольку вы уже говорите for i in F:, вы можете просто сказать if i[0] == G. То есть доступ к нулевому элементу i.

Я считаю, что вы пытаетесь вернуть iron и indian в приведенном выше примере. Посмотрите, подходит ли вам что-то подобное.

arg1 = 'i' 
arg2 = ['trees', 'iron', 'cars', 'indian'] 

def match_first_letter(G, F): 
    for i in F: 
     if i[0] == G: 
      print(i) 

match_first_letter(arg1, arg2) 
1

Внутри цикла вы можете сказать:

if i.startswith(G): 
    yield i 

Вы можете вызывать эту функцию, как:

matches = list(match_first_letter(F, G)) 
Смежные вопросы