Хорошо, так что в основном я должен проверить, есть ли в одной строке те же буквы, что и в другой строке. Обе строки получены через Вход().
Я не хочу дважды проверять, находится ли буква в другой строке, поэтому, если я уже проверил эту букву, я хочу перейти к следующей букве.
На данный момент у меня есть такой код:
str1, str2 = list(input()), list(input())
if len(str1) > len(str2):
str = str1
else:
str = str2
for x in str:
c = 0
if x in str2:
c += 1
if c != 0:
print("Both have the same letters!")
else:
print("Nope there are some letters missing..")
Я не знаю, следует ли мне работать со списками вместо использования счетчика ... пожалуйста, подробное объяснение решения или какое-либо руководство по качеству было бы очень признательно! <3
Некоторые проблемы с кодом заключаются в том, что str2 всегда используется для сравнения, даже если str2 длиннее str1.
for x in str:
c = 0
if x in str2:
Затем c устанавливается в 0 для каждого символа в str. Вместо этого у вас может быть счетчик для подсчета количества символов, которых нет в другой строке.
Это должно сработать
str1, str2 = list(input()), list(input())
if len(str1) > len(str2):
str = str1
compared_string = str2
else:
str = str2
compared_string = str1
not_in_other_string = 0
for x in str:
if x not in compared_string:
not_in_other_string += 1
if not_in_other_string == 0:
print("Both have the same letters!")
else:
print("Nope there are some letters missing..")
Похоже, вы хотите узнать, все ли символы в одной строке находятся в какой-то более крупной строке.
Вы можете использовать unique = ''.join(set(substring))
, чтобы получить список символов в подстроке, а затем создать list comprehension
, чтобы получить все символы в большей строке.
Вот мой пример:
unique = ''.join(set(substring))
not_in = [char for char in unique if char not in superstring]
Теперь вы можете проверить not_in, чтобы убедиться, что он равен нулю, иначе в подстроке был символ, которого не было в суперстроке.
Например:
superstring = "hello"
substring = "xllo"
unique = ''.join(set(substring))
not_in = [char for char in unique if char not in superstring]
print not_in
>>>['x']
print not_in == []
>>>False
Как правило, предпочтительный способ делать что-то в python - использовать понимание списков или использовать некоторую встроенную функцию, которая уже проверяет строки для вас, а не стиль C, в котором вы проходите цикл и явно проверяете букву на букву. Это идиоматический способ питонического программирования.
Разбивая понимание списка, мы получаем такой цикл:
for char in unique:
if char not in superstring:
char #char meets conditions so it is the value used in [char ...
Вот модификация, которую я бы сделал
str1, str2 = input(), input()
unique = ''.join(set(str1))
not_in = [char for char in unique if char not in str2]
if not_in == []:
print("Both have the same letters!")
else:
print("Nope there are some letters missing..")
Преобразование строк в наборы отдельных символов удаляет повторяющиеся символы, поэтому мы можем просто сравнить их:
if set(str1) == set(str2):
print("Both have the same letters!")
else:
print("Nope there are some letters missing..")
Примечание:
Как порядок элементов в наборах не важен, мы можем даже Сравните их, т.е. г.
if set(str1) <= set(str2): # <= means "is subset" in this context
print("All symbols in str1 are in str2, too.")
или
if set(str1) < set(str2): # < means "is a proper subset" in this context
print("All symbols in str1 are in str2, too, "
"but str2 has at least 1 symbol not contained in str1.")
Это было прекрасно! Большое спасибо! Если я хорошо понял метод set (), что он делает - это словарь? Извините, если вопрос дукмб, но я пытаюсь научиться шаг за шагом. Я очень ценю помощь всех!
Нет, set()
не делает словарь, он создает набор, который сам является особый вид сбора, соответствующим определению математический для набор. Например: set("abcacab")
будет {"a", "b", "c"}
(или {"c", "a", "b"}
, что то же самое - порядок элементов не имеет значения). (Примером словаря может быть {1: "a", 2: "b", 3: "c"}
- он заключен в та же пара фигурных скобок ({})
, но состоит из пар key
: value
, разделенных двоеточием (:
).)
Хорошо, теперь я полностью понимаю разницу, спасибо большое! Вы отличный человек, научив меня этому, ничего не спрашивая!
str1, str2 = input().split()
if len(str1) > len(str2):
string_to_check= str1
string_from_which_to_check = str2
else:
string_to_check = str2
string_from_which_to_check = str1
not_in_other_string = set(string_to_check) - set(string_from_which_to_check)
if len(not_in_other_string )==0:
print("character are present in string")
else:
print("{} not present in string".format(str(not_in_other_string )))
На данный момент ваша логика не проверяет наличие всех букв. Например -
str1 = 'foo', str2='fbar'
. Результатом будет У обоих одинаковые буквы!. Один из подходов - сохранить буквы обеих строк в двух разных наборах и проверить, равны ли наборы.