Длина строки без функции len - PullRequest
       2

Длина строки без функции len

1 голос
/ 22 октября 2010

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

Ответы [ 15 ]

20 голосов
/ 22 октября 2010
>>> sum(map(lambda x:1, "hello world"))
11

>>> sum(1 for x in "foobar")
6

>>> from itertools import count
>>> zip(count(1), "baz")[-1][0]
3

"скороговорка"

>>> sum(not out not in out for out in "shake it all about")
18

некоторые рекурсивные решения

>>> def get_string_length(s):
...     return 1 + get_string_length(s[1:]) if s else 0
... 
>>> get_string_length("hello world")
11
>>> def get_string_length_gen(s):
...     yield 1 + next(get_string_length_gen(s[1:])) if s else 0
... 
>>> next(get_string_length_gen("hello world"))
11
>>> 
6 голосов
/ 22 октября 2010

Вот метод O (1):

def strlen(s):
    if s == "": return 0
    return s.rindex(s[-1]) + 1

Другими словами, он не работает, считая символы, поэтому должен быть таким же быстрым для строки 1 ГБ, как и для 1строка байта.

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

4 голосов
/ 22 октября 2010

Почему вы должны избегать функции len, я не знаю, но строки являются итеративными.Вы должны быть в состоянии сделать это:

strlen = 0

for c in myString:
  strlen += 1
2 голосов
/ 23 ноября 2017

Попробуйте сделать это, это довольно просто и легко

def calculate_length(a):
    x=0
    for i in a:
       x+=1
    print(x)
2 голосов
/ 07 мая 2015

Я новичок в Python, но я бы сказал, что вы можете получить длину строки с помощью цикла for, например вместо:

> string=input("Enter a string")
> print(len(string))

сделать это:

>string=input("Enter a string")
>a=0
>for letter in string:
>a=a+1
>print(a)
1 голос
/ 10 декабря 2018

Использование цикла while

a = 'string'
count = 0

while True:
    try:
        if a[count]:
            count += 1
    except IndexError as e:
        break

print(count)
1 голос
/ 25 августа 2018

Вот метод, который не использует ни len, ни итерации:

>>> a = 'a' * 200000
>>> a.rindex(a[-1]) + 1
200000

Чтобы он работал для списков, которые не имеют rindex, используйте:

>>> a = list(range(200000))
>>> a.index(a[-1], -1) + 1
200000
1 голос
/ 22 октября 2010

Создайте файл-подобный объект из строки, прочитайте весь объект, затем скажите ваше смещение:

>>> import StringIO
>>> ss = StringIO.StringIO("ABCDEFGHIJ")
>>> ss.read()
'ABCDEFGHIJ'
>>> ss.tell()
10
1 голос
/ 22 октября 2010
>>> import re
>>> s
'mylongstring'
>>> re.subn(".","1",s)[-1]
12
>>>

Если строка содержит новые строки

>>> s="mys\ntring\n"
>>> re.compile(".",re.DOTALL).subn("",s)[-1]
10
1 голос
/ 22 октября 2010

Это странный вопрос, поэтому вот странный ответ!

try:
  for i in itertools.count(): mystring[i]
except IndexError:
  pass
...