2016-04-04 2 views
-4

Я хочу написать функцию, которая будет определять длину списка на основе пользовательского ввода. Я не хочу использовать встроенную функцию len(). Пожалуйста помогите. Функция, которую я написал, работает для строк, но для списков она не работает.как найти длину списка в python без использования len()

#function for finding out the length 
def string_length(a): 
    for i in a: 
     j+=1 
    return j 

#taking user input 
a = input("enter string :") 
length = string_length(a) 
print("length is ", length) 
+0

Я понятия не имею, как вы получили это, чтобы работать на строку. Обратите внимание, что вы добавляете 1 к переменной «j», не сказав сначала, что такое j. – Arya

+1

Что вы имеете в виду, это не работает для списка? Можете ли вы привести пример ввода, который вам не подходит? Кроме того, как уже указывалось, этот код не должен запускаться, потому что вы никогда не объявляли 'j' в своем методе. – idjaw

+0

Ваша функция (однажды исправленная, как и другие предложенные комментарии) будет работать для любого конечного итерабельного. Однако обратите внимание, что если вы называете его бесконечным итератором, он будет продолжаться вечно, вместо того, чтобы создавать исключение, например 'len'. – acdr

ответ

2

Вы, вероятно, нужно инициализировать переменную j (здесь под переименованной counter):

def string_length(my_string): 
    """returns the length of a string 
    """ 
    counter = 0 
    for char in my_string: 
     counter += 1 
    return counter 

# taking user input 
string_input = input("enter string :") 
length = string_length(string_input) 

print("length is ", length) 

Это также может быть сделано в одном «вещей» линии, используя выражение генератора, так как zondo указал :

def string_length(my_string): 
    """returns the length of a string 
    """ 
    return sum(1 for _ in my_string) 
+0

thanx много всего для ответа ... –

2

Это довольно просто:

def string_length(string): 
    return sum(1 for char in string) 

1 for char in string - generator expression, который генерирует 1 для каждого символа в строке. Мы передаем этот генератор sum(), который добавляет их всем. Проблема с тем, что у вас было, это то, что вы не указали j, прежде чем добавлять к ней. Вам нужно будет поставить j = 0 перед циклом. Там еще один способ, который не так хорошо, как то, что я ставлю выше:

from functools import reduce # reduce() is built-in in Python 2. 

def string_length(string): 
    return reduce(lambda x,y: x+1, string, 0) 

Это работает, потому что reduce() вызывает функцию lambda первым с первоначальным аргументом, 0, а первый символ в строке. Функция lambda возвращает свой первый аргумент, 0, плюс один. reduce() затем вызывает функцию снова с результатом, 1 и следующим символом в строке. Он продолжается так, пока не пройдет каждый символ в строке. Результат: длина строки.

+0

Если OP использует python3, ему понадобится использовать 'functools.reduce' для вашего второго примера. – snakecharmerb

+0

@snakecharmerb: Очень хорошая точка. Я редактировал. Я слишком привык к Python 2, поскольку LPTHW - это книга Python, которую я читал. – zondo

Смежные вопросы