亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何有效地比較Python中的兩個無序列表(而不是集合)?

如何有效地比較Python中的兩個無序列表(而不是集合)?

慕后森 2019-07-22 19:44:54
如何有效地比較Python中的兩個無序列表(而不是集合)?a = [1, 2, 3, 1, 2, 3] b = [3, 2, 1, 3, 2, 1]A&B應該被認為是相等的,因為它們有完全相同的元素,只是順序不同。問題是,我的實際列表將由對象(我的類實例)組成,而不是整數。
查看完整描述

3 回答

?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

O(N)*計數器()方法是最好的(如果您的對象是可告訴您的):

def compare(s, t):
    return Counter(s) == Counter(t)

O(n對數n)*排序()方法次之(如果對象是可排序的):

def compare(s, t):
    return sorted(s) == sorted(t)

O(n*n)*如果這些對象既不可使用,也不可排序,則可以使用相等:

def compare(s, t):
    t = list(t)   # make a mutable copy
    try:
        for elem in s:
            t.remove(elem)
    except ValueError:
        return False
    return not t


查看完整回答
反對 回復 2019-07-22
?
弒天下

TA貢獻1818條經驗 獲得超8個贊

你可以對兩者進行排序:

sorted(a) == sorted(b)

計數排序也可能更有效率(但它要求對象是可哈斯的)。

>>> from collections import Counter>>> a = [1, 2, 3, 1, 2, 3]>>> b = [3, 2, 1, 3, 2, 1]>>> print (Counter(a) == Counter(b))True


查看完整回答
反對 回復 2019-07-22
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

最好的方法是對列表進行排序和比較。(使用Counter)無法處理無法使用的對象。)對于整數來說,這很簡單:

sorted(a) == sorted(b)

對于任意的對象,它會變得更加棘手。如果您關心對象標識,即對象都在兩個列表中,可以使用id()函數作為排序鍵。

sorted(a, key=id) == sorted(b, key==id)

(在Python2.x中,實際上不需要key=參數,因為可以將任何對象與任何對象進行比較。排序是任意的,但是穩定的,因此它可以很好地實現這個目的;不管對象的順序是什么,只是兩個列表的排序是相同的。然而,在Python 3中,在許多情況下不允許比較不同類型的對象-例如,不能將字符串與整數進行比較-因此,如果要擁有不同類型的對象,最好顯式使用對象的ID。

如果要比較列表中的對象價值,另一方面,首先您需要定義對象的“值”意味著什么。然后,您將需要一些方法來提供作為鍵(對于Python 3,作為一個一致的類型)。對于許多任意對象來說,一種可能的方法是根據它們的repr()..當然,這會浪費很多額外的時間和內存。repr()用于大列表的字符串等等。

sorted(a, key=repr) == sorted(b, key==repr)

如果對象都是您自己的類型,則可以定義__lt__()使對象知道如何將自己與他人進行比較。然后您就可以對它們進行排序,而不必擔心key=參數。當然你也可以定義__hash__()和使用Counter,這會更快。


查看完整回答
反對 回復 2019-07-22
  • 3 回答
  • 0 關注
  • 2156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號