我有一个带有2个参数的函数 - 一个输入字符串和一个单词列表。对于列表中存在于字符串中的每个单词,函数返回“True”,否则返回“False”。
我的代码如下:
#!/usr/bin/python
# inputStr is a string, inputList is list of strings
def keyword_usage(inputStr, inputList):
splitStr = inputStr.split();
L = [];
k = 0;
bool = 0;
for i in range(0,len(inputList)):
for j in range(0, len(inputStr)):
if inputList[i]==splitStr[j]:
bool = 1;
else:
bool = 0;
if bool==1:
L[k] = "True";
else:
L[k] = "False";
k+=1;
return tuple(L);
我在解释器中运行它,如下所示:
>>> from keyword_usage import keyword_usage
>>> res = keyword_usage('Dive Into Python', ['Python', 'python', 'scala'])
当我按回车键时,我明白了:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "keyword_usage.py", line 17, in keyword_usage
if inputList[i]==splitStr[j]:
IndexError: list index out of range
我是Python编码新手,非常困惑。这似乎是一个基本问题,但我无法在任何论坛上得到任何答案。有人可以发现错误吗?在此先感谢!!
答案 0 :(得分:2)
我会建议更多的pythonic解决方案:
def keyword_usage(inputStr, inputList):
splitStr = inputStr.split()
L = []
for i in inputList:
L.append(i in splitStr)
return tuple(L)
就是这样!
使用in
运算符。它检查列表中是否存在元素并返回True
或False
。
'Dive' in ['Python', 'python', 'scala']
>>> False
'Python' in ['Python', 'python', 'scala']
>>> True
答案 1 :(得分:1)
使用此:
def keyword_usage(inputStr, inputList):
splitStr = inputStr.split();
L = []
b = False
for i in range(0,len(inputList)):
for j in range(0, len(inputStr)):
b = inputList[i]==splitStr[j]
L.append(b)
return tuple(L)
print keyword_usage('Dive Into Python', ['Python', 'python', 'scala'])
你犯了很多错误:
错误原因是:
L[k] = "True";
由于L还没有商品,因此您无法以这种方式添加商品。请改为使用附加:
L.append("True")
现在输出:
(True, False, False)
答案 2 :(得分:1)
让我们超越一步。学习了解理解列表:
def keyword_usage(inputStr, inputList):
splitStr = inputStr.split()
L = [i in splitStr for i in inputList]
return tuple(L)
现在您可以运行该功能:
keyword_usage('Dive Into Python', ['Python', 'python', 'scala'])
>>> (True, False, False)
但我会进一步扩展这个功能:
def keyword_usage(inputStr, inputList):
splitStr = inputStr.split()
L = [i in splitStr for i in inputList]
return dict(zip(inputList, L))
现在你有了这个结果:
keyword_usage('Dive Into Python', ['Python', 'python', 'scala'])
>>> {'Python': True, 'python': False, 'scala': False}
因此,您可以立即知道在字符串中找到了哪个列表元素。
你可以像这样重写列表理解:
L = [(i in splitStr) for i in inputList]
为了更好的可读性,如果你更喜欢它。
内置函数zip
将两个列表组合在一起,列表A的第一个元素与列表B的第一个元素,列表A的第二个元素与列表B的第二个元素,依此类推。然后,内置函数dict
会为这些值创建一个很好的字典。
享受!
答案 3 :(得分:0)
看起来只是一个错字。
此:
for j in range(0, len(inputStr)):
应该是这样的:
for j in range(0, len(splitStr)):
答案 4 :(得分:0)
print len(splitStr)
给出: - 3
print len(inputList), len(inputStr)
给出: - 3
,18
检查时
if inputList[i]==splitStr[j] #for i = 1 and j = 12
splitStr
只有三个值['Dive', 'Into', 'Python']
当你运行for j in range(0, len(inputStr))
时,每次j
从(0,18)获取值时,它将循环18次anf,因此检查splitStr[j]
让我们说10然后{{1}实际上(splitStr[10]
)超出范围。