代码之家  ›  专栏  ›  技术社区  ›  Chris

如何返回两个2d列表中的不匹配项?

  •  0
  • Chris  · 技术社区  · 1 年前

    我有两个2d列表,两个列表都有大量的行和不同大小的长度。我很难在df1中的每一行中找到匹配项,并且只返回df2中每一行的不匹配值。例如,df1[0]在df2[0]返回17中具有1,3,5的匹配。df1[0]在df2[1]中没有匹配项,不返回任何内容或括号。对于df1和df2中的每一行,以此类推。

    我试过这些代码,但没有给我想要的。

    no_matches = []
    for sublist1 in df1:
        for sublist2 in df2:
            no_match = [val for val in sublist2 if val not in sublist1]
            if no_match: no_matches.append(no_match)
    print("no matches:", no_matches)
    

    这里有一个简短的例子(我的2d列表)

     df1 = [[1, 7, 3, 5], [2, 5, 14, 10]]
     df2 = [[1, 17, 3, 5], [34, 14, 74], [34, 3, 87], [25, 14, 10]]
    

    转换为三维列表。

     no_match = 0: [[17], [], [34,87], []]
                1: [[1,3,17], [34,74], [], [25]]
    

    可能的愿望(转换为2d列表并删除括号)如果可能

     no_match = [[17],[34,87],[1,3,17],[34,74],[25]]
    
    2 回复  |  直到 1 年前
        1
  •  3
  •   TayJen    1 年前

    只需使用集合及其减法

    df1 = [[1, 7, 3, 5], [2, 5, 14, 10]]
    df2 = [[1, 17, 3, 5], [34, 14, 74], [34, 3, 87], [25, 14, 10]]
    
    no_matches = []
    for sublist1 in df1:
        set_1 = set(sublist1)
        for sublist2 in df2:
            set_2 = set(sublist2)
            no_match = list(set_2 - set_1)
            if no_match and len(no_match) != len(set_2):
                no_matches.append(no_match)
    
    print("no matches:", no_matches)
    

    输出 no matches: [[17], [34, 87], [1, 3, 17], [34, 74], [25]]

        2
  •  2
  •   trincot Jakube    1 年前

    你似乎有一个例外 “只返回df2中每行的不匹配值” 。在您描述的示例中,如果 “df1[0]在df2[1]中没有匹配项,不返回任何内容” ,但这是违反规则的。如果这确实是一个异常,那么您需要将该异常添加到您的 if 陈述

        if no_match and no_match != sublist2: 
            no_matches.append(no_match)
    

    有了这个附加条件,您将获得所需的输出:

    no matches: [[17], [34, 87], [1, 17, 3], [34, 74], [25]]