【问题标题】:Python compare tuplesPython比较元组
【发布时间】:2014-01-26 14:54:19
【问题描述】:

您好,我想将一个列表与 Python 中的另一个列表进行比较,其中元素的顺序无关紧要

例如

list=[1,2,3]

应该等于list2=[3,2,1]list3=[3,1,2] 等。我想动态地做,因为我不知道列表中有多少元素?有什么快速的方法吗?我想出的唯一方法是在每个列表中搜索另一个列表的元素,但这有 O(n^2)。我也无法对列表进行排序,因为在我的实现中列表是列表列表。我只是想要一个简单版本的问题的答案,然后修改它!你能帮帮我吗?

【问题讨论】:

标签: python list compare


【解决方案1】:

您可以简单地将列表转换为集合,然后检查它们是否相等

list1, list2, list3 = [1, 2, 3], [2, 3, 1], [1, 2, 3, 4]
print set(list1) == set(list2)    # True
print set(list2) == set(list3)    # False
print set(list1) == set(list3)    # False

如果你想确保元素只存在与另一个列表中相同的次数,你可以使用collections.counter (Thanks @delnan),像这样

list1, list2, list3, list4 = [1, 2, 3], [2, 3, 1], [1, 2, 3, 4], [1, 2, 3, 3]
from collections import Counter
print Counter(list1) == Counter(list2)    # True
print Counter(list2) == Counter(list3)    # False
print Counter(list1) == Counter(list3)    # False
print Counter(list1) == Counter(list4)    # False

【讨论】:

  • @NG。也许它正是 OP 想要的,很难说。如果没有,collections.Counter 也可以。
  • @NG。我没有任何重复,所以它会工作!谢谢你的答案,我会尽快标记它!
  • @delnan 谢谢 :) 我已将其包含在答案中 :)
【解决方案2】:

如果列表允许有重复元素:

def list_eql(x, y):
    return sorted(x) == sorted(y)

如果列表没有重复元素:

def list_eql(x, y):
    return set(x) == set(y)

编辑:据我了解,您的问题 xy 是列表列表。 在这种情况下,set 解决方案将不起作用(因为列表是可变的),您需要先将内部列表转换为元组:

def list_eql(x, y):
    return set(map(tuple, x)) == set(map(tuple, y))

【讨论】:

  • 如果列表有重复,仅检查两个列表的长度是行不通的。考虑列表 x=[1,1,2,2,3], y=[1,1,1,2,3]。即使这两个列表不相等,您的函数也会返回 true。
猜你喜欢
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 2021-06-24
  • 2014-02-20
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多