Найти - Пользователи
Полная версия: "" in string = true
Начало » Python для новичков » "" in string = true
1
Bilbo
Начинаю изучай Python и случайно столкнулся с такой ситуацией. Пользователь вводит букву, далее его эта буква ищется в строке. Случайно пользователь ввел пустую строку и… она нашлась в строке!
 >>>"" in "строка"
True

Не могу понять почему такая рекация? Так и должно быть?
При этом
 >>>"" in ("строка1")
True
Но
 >>>"" in ("строка1", "строка2")
False
4kpt_V
Частью строки является символ, часть набора является его элемент.

Вот тут вот набор не создается

 "" in ("строка1")

Это равносильно

 "" in "строка1"

Чтобы сделать набор из одного элемента, нужно

 "" in ("строка1",)
py.user.next
Bilbo
Не могу понять почему такая рекация? Так и должно быть?
Да, потому что, например, строка “ab” содержит три пустые строки: перед a, между a и b, после b.


Bilbo
Но
  
>>>"" in ("строка1", "строка2")
False
Это поиск в кортеже. Операция in применима почти ко всем встроенным типам. В строке операция in ищет строку, а в кортеже операция in ищет элемент.


Чтобы проверить своё условие, тебе надо сначала убедиться, что строка не пустая, а потом уже, если она не пустая, искать её в другой строке.
  
>>> s = ''
>>> if s and s in 'abc':
...   True
... else:
...   False
... 
False
>>> 
>>> s = 'b'
>>> if s and s in 'abc':
...   True
... else:
...   False
... 
True
>>>
Bilbo
С кортежами понял, спасибо. А вот со словами, как последовательностями символов все равно не разобрался.
Например, так:
 s = "привет"
if "" in s:
    print ("True")

Как я понимаю логику работы, Python последовательно сравнивает пустую строку “” (элемент) с каждым символом (элементом) слова “привет”. Но:
 "" != "п"
"" != "р"
"" != "и"
...
"" != "т"

Ни один символ строки не равен пустой строке.

Мне кажется логичным, что если “” in “привет” дает положительный результат, то я должен иметь возможность сослаться (получить индекс) на элемента “” в строке “привет”. Поэтому попробовал сделать так:
 s.find("")
и получил ответ
 0
Потом сделал так:
 s.find("п")
и получил тот же ответ
 0
Получается странная вещь, одной позиции в строке соответствует одновременно два элемента.

ИМХО, мне кажется, что здесь ошибка в логике работы Python и поиск пустой строки в строке должен всегда давать False.
Shaman
что по-вашему должны возвращать
 '' in ''
?
 'aaa'.split('a')
?
py.user.next
Bilbo
 s = "привет"
пустота п пустота р пустота и пустота в пустота е пустота т пустота

Bilbo
  s.find("")
и получил ответ
0
Эта пустая строка там есть, но в неё не входит ни один символ.
  
>>> ''[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>>
Bilbo
Shaman, py.user.next, спасибо. Мой уровень пока не высок, разобраться даже в ответах сложно. Пример со сплитом мне показался очень показательным. Как написал py.user.next, до и после каждого символа - пустота. Спасибо.
wallet
Bilbo
Мне кажется логичным, что если “” in “привет” дает положительный результат, то я должен иметь возможность сослаться (получить индекс) на элемента “” в строке “привет”.

 >>> "привет"[0:0] == ''
True
>>> 
"привет"[1:1] == ''
True
...

Если представить работу оператора in в виде цикла проверяющего все возможные значения, срезами на основании длины строки которую необходимо найти

 p = ''
s = "привет"
for i,n in enumerate(s):
    if s[i:i + len(p)] == p:
        print(True)
        break

так как длина пустой строки равна “0” проверяется
  s[0:0+0]=='', s[1:1+0]=='', s[2:2+0]=='' ....
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB