我在Python中有兩個列表,以下所示: python
temp1 = ['One', 'Two', 'Three', 'Four'] temp2 = ['One', 'Two']
我須要用第一個列表中的項目建立第二個列表,而第二個列表中沒有這些項目。 從示例中,我必須獲得: 函數
temp3 = ['Three', 'Four']
有沒有循環和檢查的快速方法嗎? spa
使用如下簡單函數能夠找到兩個列表(例如list1和list2)之間的差別。 code
def diff(list1, list2): c = set(list1).union(set(list2)) # or c = set(list1) | set(list2) d = set(list1).intersection(set(list2)) # or d = set(list1) & set(list2) return list(c - d)
要麼 排序
def diff(list1, list2): return list(set(list1).symmetric_difference(set(list2))) # or return list(set(list1) ^ set(list2))
經過使用上述函數,能夠使用diff(temp2, temp1)
或diff(temp1, temp2)
來找到diff(temp2, temp1)
。 二者都會給出結果['Four', 'Three']
。 您沒必要擔憂列表的順序或先給出哪一個列表。 文檔
Python文檔參考 get
這是另外一個解決方案: hash
def diff(a, b): xa = [i for i in set(a) if i not in b] xb = [i for i in set(b) if i not in a] return xa + xb
若是對difflist的元素進行排序和設置,則能夠使用幼稚的方法。 it
list1=[1,2,3,4,5] list2=[1,2,3] print list1[len(list2):]
或使用本機set方法: io
subset=set(list1).difference(list2) print subset import timeit init = 'temp1 = list(range(100)); temp2 = [i * 2 for i in range(50)]' print "Naive solution: ", timeit.timeit('temp1[len(temp2):]', init, number = 100000) print "Native set solution: ", timeit.timeit('set(temp1).difference(temp2)', init, number = 100000)
天真的解決方案:0.0787101593292
本機設置解決方案:0.998837615564
arulmr解決方案的單行版本
def diff(listA, listB): return set(listA) - set(listB) | set(listA) -set(listB)
若是遇到TypeError: unhashable type: 'list'
,則須要將列表或集合轉換爲元組,例如
set(map(tuple, list_of_lists1)).symmetric_difference(set(map(tuple, list_of_lists2)))