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

劳拉·史密斯

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

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"] 

我现在面临的问题:

  1. 我不确定我Reply_List是否以正确的方式正确解码有人可以帮我也验证一下吗?

  2. 我不确定如何删除相应的项目,Reply_List以及Request_List何时根据条件找到匹配项if (i.split("/")[1] == j.split("/")[1])

安德乌
  1. 您可以使用列表理解来解码列表:

decoded_Reply_List = [li.decode(encoding='utf-8') for li in Reply_List]

  1. 在这种情况下,如果您还想在创建新列表时从列表中删除项目,我会说列表理解不是正确的做法只需使用嵌套的 for 循环:
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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Scala/Java:比较两个列表/集合并从两个列表中删除匹配的元素

比较两个列表并从一个列表中删除重复列表

根据两个索引中任一索引的值从两个列表中删除项目

如何比较部分匹配的列表并从两个列表创建新列表

如何从两个列表中找到匹配的部分项目

如果两个列表中的索引匹配,如何返回列表的名称?(右)

postgres 通过两个列表匹配(列表中的列表)

关联列表中的两个项目

当有两个相同的字符时如何索引列表

如何匹配Scala中两个列表中的元素?

比较两个列表并从 list2 中删除第一个匹配的重复项

如何在Groovy中合并两个列表的索引?

如何按索引比较python中的两个列表

匹配两个列表之间的元素,但索引为索引

如何从两个列表中制作列表列表

如何从两个列表中删除重复的元素(成对)?

如何从数组或列表中删除两个元素的序列?

Java。如何从两个列表中删除重复的对象

返回表示两个列表中的匹配项的列表

如何有效地找到两个列表中匹配元素的索引

如何基于两个自定义对象删除列表中的重复项

查找两个列表的匹配元素的索引

如何合并从两个查询创建的两个列表

比较列表中的两个项目,然后在索引处拆分为较小的列表

比较2个具有部分匹配的列表数据,并从两个列表中返回汇总数据

如何使用Pandas选择两列项与两个列表项(相同索引)匹配的行?

Python,通过从较长列表中删除来匹配两个列表长度

合并索引上的两个列表

遍历两个列表并返回索引