代码中的列表索引超出范围错误

时间:2019-08-27 14:28:35

标签: python

我有以下一段代码。

result = "1/1/2010|1/2/2111"
request = "1/1/1.3.4.5.6/1/1/127.0.0.1"

replylist = result.split("|")
finalresultlist = [
    f"{i.split('/')[2]}.{j.split('/')[2]}"
        for i in request
        for j in replylist \
        if (i.split("/")[1] == j.split("/")[1])
]

print(finalresultlist)

注意:根据每个{之后的索引[1]中的值,如果存在匹配f"{i.split('/')[2]}.{j.split('/')[2]}",则"1.3.4.5.6""2010"if (i.split("/")[1] == j.split("/")[1])连接起来{1}和result字符串在request上分割。

我想返回一个新字符串,该字符串将'|'的1.3.4.5.6与request的2010连接在一起,以返回包含字符串的列表:result

在当前代码中,出现错误“列表超出范围”。我无法解决此问题。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

好吧,让我们迈出第一步。

result = "1/1/2010|1/2/2111"
result = result.split("|")

现在result['1/1/2010', '1/2/2111']

request = "1/1/1.3.4.5.6/1/1/127.0.0.1"
request = request.split("/")

现在request['1', '1', '1.2.3.4.5.6', '1', '1', '127.0.0.1'] 因此,获得所需结果的简单方法是

finalresult = "{}{}".format(request[2],result.split('/')[2])

我不确定您的循环逻辑,但是,您应该能够使用此代码根据您的业务逻辑以编程方式生成更多字符串。

答案 1 :(得分:2)

调试

作为molbdnilo commented

  

request是一个字符串,对其进行迭代(for i in request)一次可以给您一个字符。在我看来,您正在尝试一次做太多事情。

如果我们查看完整的错误消息(包括堆栈跟踪),则会看到有关该消息的建议:

Traceback (most recent call last):
  File "/home/wjandrea/test.py", line 7, in <module>
    for i in request
  File "/home/wjandrea/test.py", line 9, in <listcomp>
    if (i.split("/")[1] == j.split("/")[1])
IndexError: list index out of range

重新排列代码指出问题所在i.split("/")[1]

解决方案

完全删除for i in request,并用request代替i

finalresultlist = [
    f"{request.split('/')[2]}.{j.split('/')[2]}"
    for j in replylist
    if request.split("/")[1] == j.split("/")[1]
]

输出['1.3.4.5.6.2010']

然后我们还可以进行其他一些改进,例如更好的变量名和将内容移出列表理解范围。

replies = [i.split('/') for i in result.split("|")]
request_list = request.split('/')

final_result_list = [
    f"{request_list[2]}.{reply[2]}"
    for reply in replies
    if request_list[1] == reply[1]
]

print(final_result_list)