我有两个列表,其中包含以下类型的信息。
List #1:
Request_List = ["1/1/1.34", "1/2/1.3.5", "1/3/1.2.3", ...same format elements]
List #2:
Reply_List = ["1/1/0", "1/3/1", "1/2/0", ...same format elements]
从“回复”列表中,我希望能够比较“#/#/#”中的第二个项目,在这种情况下它将是 1、3、2,依此类推与回复列表中的所有项目并检查是否与“请求列表”中的第二项匹配。如果有匹配项,那么我希望能够返回一个新列表,该列表将包含请求字符串中第三个索引的信息,并在回复中附加匹配字符串的第三个索引。
The result would be like the following.
Result = ["1.34.0", "1.3.5.0", "1.2.3.1"]
请注意,0 被附加到 1.34,1 被附加到 1.3.4,0 被附加到 1.2.3 来自“回复”列表中的相应索引,因为“回复”列表中存在第二个索引. “回复”列表可以将项目放置在列表中的任何位置。
解决上述问题的代码如下所示。
def get_list_of_error_codes(self, Reply_List , Request_List ):
decoded_Reply_List = Reply_List .decode("utf-8") # I am not sure if this is
the right way to decode all the elements in the list?
Result = [
f"{i.split('/')[-1]}.{j.split('/')[-1]}"
for i in Request_List
for j in decoded_Reply_List
if (i.split("/")[1] == j.split("/")[1])
]
return Result
res = get_list_of_error_codes(Reply_List , Request_List)
print (res) # ["1.34.0", "1.3.5.0", "1.2.3.1"]
我现在面临的问题:
我不确定我Reply_List
是否以正确的方式正确解码。有人可以帮我也验证一下吗?
我不确定如何删除相应的项目,Reply_List
以及Request_List
何时根据条件找到匹配项if (i.split("/")[1] == j.split("/")[1])
。
decoded_Reply_List = [li.decode(encoding='utf-8') for li in Reply_List]
def get_list_of_error_codes(self, Reply_List, Request_List):
decoded_Reply_List = [li.decode(encoding='utf-8') for li in Reply_List]
Result = []
for i in list(Request_List):
for j in decoded_Reply_List:
if (i.split("/")[1] == j.split("/")[1]):
Result.append(f"{i.split('/')[-1]}.{j.split('/')[-1]}")
Reply_List.remove(j)
break
else:
continue
Request_List.remove(i)
return Result
Request_List = ["1/1/1.34", "1/2/1.3.5", "1/3/1.2.3"]
Reply_List = [b"1/1/0", b"1/3/1", b"1/2/0"]
print(get_list_of_error_codes("Foo", Reply_List, Request_List))
# Output: ['1.34.0', '1.3.5.0', '1.2.3.1']
需要注意的一些事项:我添加了一个,break
这样我们就不会在找到匹配项时继续寻找匹配项。它只会匹配第一对,然后继续。
在 中for i in list(Request_List)
,我添加了list()
演员表以有效地制作列表的副本。这允许我们在Request_List
不中断循环的情况下删除条目。我没有这样做,for j in decoded_Reply_List
因为它已经是Reply_List
. (我假设您想从 中删除条目Reply_List
)
最后一个是else: continue
。我们不希望达到Request_List.remove(i)
,如果我们没有找到匹配。如果break
被调用,else
则不会被调用,这意味着我们将到达Request_List.remove(i)
。但是,如果循环完成但没有找到匹配项,则循环将进入else
,我们将通过调用跳过删除步骤continue
编辑:
实际上,Reply_List.remove(j)
中断了,因为我们已经j
在这个方法中解码了,因此解码j
的对象与Reply_List
. 下面是一些修改后的代码,可以解决这个问题:
def get_list_of_error_codes(Reply_List, Request_List):
# decoded_Reply_List = [li.decode(encoding='utf-8') for li in Reply_List]
Result = []
for i in list(Request_List):
for j in list(Reply_List):
dj = j.decode(encoding='utf-8')
if (i.split("/")[1] == dj.split("/")[1]):
Result.append(f"{i.split('/')[-1]}.{dj.split('/')[-1]}")
Reply_List.remove(j)
break
else:
continue
Request_List.remove(i)
return Result
Request_List = ["1/1/1.34", "1/2/1.3.5", "1/3/1.2.3"]
Reply_List = [b"1/1/0", b"1/3/1", b"1/2/0"]
print("Result: ", get_list_of_error_codes(Reply_List, Request_List))
print("Reply_List: ", Reply_List)
print("Request_List: ", Request_List)
# Output:
# Result: ['1.34.0', '1.3.5.0', '1.2.3.1']
# Reply_List: []
# Request_List: []
我所做的是,我没有创建单独的解码列表,而是在条目循环时对其进行解码,然后从Reply_List
. 这也应该更有效率,因为我们现在不会循环Reply_List
两次。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句