Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当两个列表中都有基于索引的匹配项时,如何解码列表并从两个列表中删除项目?_Python - Fatal编程技术网

Python 当两个列表中都有基于索引的匹配项时,如何解码列表并从两个列表中删除项目?

Python 当两个列表中都有基于索引的匹配项时,如何解码列表并从两个列表中删除项目?,python,Python,我有两个列表,其中包含以下类型的信息 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,依此类推,并检查是否与“请求

我有两个列表,其中包含以下类型的信息

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
我现在面临的问题是:

  • 我不确定我是否以正确的方式解码了
    回复列表
    。有人能帮我验证一下吗

  • 如果(I.split(“/”[1]==j.split(“/”[1])根据条件找到匹配项,我不确定如何删除
    回复列表
    请求列表
    的相应项

  • 您可以使用列表理解来解码列表:
  • decoded\u Reply\u List=[li.decode(encoding='utf-8')用于回复列表中的li]

  • 在这种情况下,如果您希望在创建新列表时也从列表中删除项目,我认为列表理解不是正确的做法。只需使用嵌套for循环:
  • 需要注意的一些事项: 我添加了一个
    break
    ,这样我们就不会在找到匹配项时继续寻找匹配项。它只会匹配第一对,然后继续

    for i In list(Request_list)
    中,我添加了
    list()
    强制转换以有效地复制列表。这允许我们在不中断循环的情况下从
    Request_list
    中删除条目。我没有对解码的回复列表中的j执行此操作,因为它已经是
    回复列表
    的副本。(我假设您想从
    回复列表中删除条目

    最后是
    else:continue
    。我们不想到达
    请求列表。如果没有找到匹配项,请删除(i)
    。如果调用
    break
    ,则不会调用
    else
    ,这意味着我们将到达
    请求列表。删除(i)
    。但是如果循环完成时没有找到匹配项,则循环将进入
    else
    ,我们将通过调用
    continue
    跳过删除步骤

    编辑:

    实际上,
    Reply\u List.remove(j)
    中断,因为我们在这种方法中解码了
    j
    ,因此解码的
    j
    Reply\u 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\u列表
    中删除未解码的条目。这也应该更有效一些,因为我们现在不会在
    Reply\u列表
    中循环两次。

    非常感谢您的持续帮助。我我也会尝试解决你提到的编辑问题。但是解码不是只删除
    b''
    字段吗?@LauraSmith我已经添加了编辑过的代码。现在应该可以了。@LauraSmith我假设你正在处理的数据需要解码。我用于
    回复列表的示例列表
    我使用了
    b''
    ,因为该示例将如果我使用字符串,请中断,因为您无法解码字符串。如果
    Reply\u List
    只是一个字符串列表,您可以完全忽略解码步骤。我正在列表中存储json回复,这看起来很好。我将进一步测试它,但对我来说很好。非常感谢。:)@LauraSmith不客气!如果您正在存储json回复,也许您想查看
    json
    库。具体来说是
    json.loads()
    。祝您好运!
    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']            
    
    
    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:  []