【问题标题】:How do I compare two unordered lists of lists with unordered lists inside of them?如何将两个无序列表与其中的无序列表进行比较?
【发布时间】:2017-10-06 13:13:20
【问题描述】:

如何比较两个无序列表和其中的无序列表?

假设这两个列表中的列表的顺序不一定相同。还假设列表列表中给定列表中的项目的顺序不一定是相同的。示例如下:

dummy_list_A =  [['A'], ['B'], ['C', 'D']]
dummy_list_B =  [['B'], ['A'], ['D', 'C']]

我已经在 Stack Overflow 上查看了诸如 Test if two lists of lists are equal 之类的问题的答案,但没有一个有效。您可以在下面看到,比较列表的最常见答案不适用于我的场景。

print sorted(dummy_list_A) == sorted(dummy_list_B)
False

print set(map(tuple,dummy_list_A)) == set(map(tuple,dummy_list_B))
False

print ((len(dummy_list_A) == len(dummy_list_B)) and (all(i in dummy_list_B for i in dummy_list_A)))
False

【问题讨论】:

  • 应该[['A'], ['C'], ['B', 'D']] 与其中任何一个比较吗?
  • 元素是否可散列?构建(冻结)集合可能比排序更有效。
  • @chepner 这可能不起作用,因为它不会考虑重复的元素。
  • @MosesKoledoye 不,[['A'], ['C'], ['B', 'D']] 不应与其中任何一个比较。

标签: python list comparison


【解决方案1】:

首先你需要对子列表列表的列表元素进行排序,然后是主列表

>>> sorted([sorted(i) for i in dummy_list_A])
[['A'], ['B'], ['C', 'D']]

>>> sorted([sorted(i) for i in dummy_list_B])
[['A'], ['B'], ['C', 'D']]

>>> sorted([sorted(i) for i in dummy_list_A]) == sorted([sorted(i) for i in dummy_list_B])
True

【讨论】:

    【解决方案2】:

    您可以简单地对子列表中的元素进行排序,对子列表进行排序并比较两个列表。

    >>> dummy_list_A =  [['A'], ['B'], ['C', 'D']]
    >>> dummy_list_B =  [['B'], ['A'], ['D', 'C']]
    >>> sorted(map(sorted, dummy_list_A))
    [['A'], ['B'], ['C', 'D']]
    >>> sorted(map(sorted, dummy_list_B))
    [['A'], ['B'], ['C', 'D']]
    >>> def signature(l):
    ...   return sorted(map(sorted, l))
    ... 
    >>> signature(dummy_list_A) == signature(dummy_list_B)
    True
    

    【讨论】:

      【解决方案3】:
      dummy_list_A =  [['A'], ['B'], ['C', 'D']]
      dummy_list_B =  [['B'], ['A'], ['D', 'C']]
      print( sorted(sum(dummy_list_A,[])) == sorted(sum(dummy_list_B,[])) )
      

      是的

      【讨论】:

      • [['A', 'B', 'C', 'D']] 将被视为与此方法相同。
      • 我认为 OP 没有指定它是否不应该相等。
      【解决方案4】:

      您可以使用 Python 的 .sort() 方法对内部列表和列表列表进行排序。

        list_1 = [['A'], ['B'], ['C', 'D']]
        list_2 = [['B'], ['A'], ['D', 'C']]
      
         def list_sorter(list_of_list):
             for a_list in list_of_list:
                 a_list.sort()
             list_of_list.sort()
         list_sorter(list_1)
         list_sorter(list_2)
         print(list_1 == list_2)
         True
      

      【讨论】:

      • 请确保添加一些关于您的答案的描述。这是您可以在 SO 中遵循的好习惯。
      【解决方案5】:

      我会这样解决它。

      sorted(dummy_list_B, key=lambda x: sorted(x)) == sorted(dummy_list_A, key=lambda x: sorted(x))
      

      【讨论】:

        【解决方案6】:

        您可以将列表列表转换为冻结集集。然后您可以比较这两组:

        dummy_list_A =  [['A'], ['B'], ['C', 'D']]
        dummy_list_B =  [['B'], ['A'], ['D', 'C']]
        
        set_A = {frozenset(i) for i in dummy_list_A}
        set_B = {frozenset(i) for i in dummy_list_B}
        
        set_A == set_B
        

        是的

        您还可以执行其他set 操作:

        dummy_list_C =  [['B'], ['A'], ['D', 'E']]
        set_C = {frozenset(i) for i in dummy_list_C}
        
        set_A == set_C
        

        错误

        set_A.intersection(set_C)
        

        {frozenset({'A'}),frozenset({'B'})}

        set_A.difference(set_C)
        

        {frozenset({'D', 'C'})}

        注意:如果您的外部列表多次包含相同的内部列表,则重复的列表将减少为一个冻结集,因此以下列表也将被视为相等:

        dummy_list_A =  [['A'], ['A'], ['B'], ['C', 'D'], ['D', 'C']]
        dummy_list_B =  [['B'], ['A'], ['D', 'C']]
        
        set_A = {frozenset(i) for i in dummy_list_A}
        set_B = {frozenset(i) for i in dummy_list_B}
        
        set_A == set_B
        

        是的

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多