假设我们有一个字符串“ abc”和另一个字符串“ bcd”。如果我在'bcd'中执行'abc',它将返回false。我想说的是'bcd'字符串中是否有'abc'字符,而不是返回true。 (蟒蛇) 编辑:谢谢您的拼写更改。这让我感到愚蠢。他们是错别字。
我尝试使用for循环遍历字符串,但这很笨拙,我认为这不是一个好习惯。无论如何,我无法使其灵活到足以满足我的需求。
import random
symb1 = random.choice('abc@') # I am trying to test if it chose AL one
# symbol
symb2 = random.choice('abc!')
mystring = (symb1+symb2) #lets say mystring is 'a!'
if mystring in '@!' # I want to test here somehow if part of mystring is
# in @!
我希望它输出true,而输出是false。我知道为什么,我只需要帮助就可以创建一种方法来测试mystring中的符号
答案 0 :(得分:2)
在进行in
检查时迭代一个字符串:
any(c in "@!" for c in mystring)
“'@!'中的mystring中有c吗?”
答案 1 :(得分:1)
您可以使用列表推导。 例子;
>>> a = 'abc'
>>> b = 'bcd'
>>> [letter for letter in a if letter in b] # list comprehensions
['b', 'c']
>>> any(letter for letter in a if letter in b) # generator expression
True
如@asikorski所述;更改为使用生成器表达式,以便循环在第一个匹配项时停止。
答案 2 :(得分:0)
好吧,这种理解更有意义,但我决定做一个更扩展的for循环。我找到了使它不那么可怕的方法。我只是在教一个朋友python,我希望他能够更轻松地阅读代码。这是程序中的代码部分。
def punc():
characters = int(input('How long would you like your password to be? : '))
passlist = []
for x in range(characters):
add = random.choice(string.ascii_letters + '@@@@@$$$$$~~~~!!!!!?????')
passlist.append(add)
l = []
for x in passlist:
if x in ['@','$','~','!','?']:
l.append(0)
if len(l) == 0:
punc()
else:
print(''.join(passlist))
答案 3 :(得分:0)
解决方案很少:
if any(char in 'bcd' for char in 'abc'):
...
使用生成器+内置any
。它不必创建具有列表理解功能的列表,也不必浪费时间来收集两个字符串中的所有字母,因此它的存储效率很高。
def check_letters(word1, word2):
for char in word1:
if char in word2:
return True
reeturn False
if check_letters('abc', 'bcd'):
...
很明显。
if set(list('abc')) & set(list('bcd')):
...
这个使用一些技巧。 list
将字符串转换为字母列表,set
从列表中创建一组字母。然后使用&
运算符创建两个集合的交集,并且如果交集中有任何元素,则if
的条件求值为True
。
但是,它不是很有效。它必须创建两个列表和两个集合。