IndexError with Python中的列表

时间:2014-11-14 13:09:49

标签: python

我有一个带有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编码新手,非常困惑。这似乎是一个基本问题,但我无法在任何论坛上得到任何答案。有人可以发现错误吗?在此先感谢!!

5 个答案:

答案 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运算符。它检查列表中是否存在元素并返回TrueFalse

'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'])

你犯了很多错误:

  • Python不使用';'
  • 不要使用0或1作为布尔值,而是使用True和False。
  • 现在你可以在布尔
  • 中保存True或False
  • 在第二个循环中,我认为你使用splitStr而不是inputList

错误原因是:

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)

给出: - 318

检查时

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])超出范围。