[英]Comparing all elements of 2 lists with Python 2
我有2個列表: a = ['5', '2', '3', '4']
和b = ['1', '6', '7', '5']
。 使用Python 2,如何將a中的每個列表元素與b
中a
每個元素進行比較? (即a[0] == b[0]
, a[0] == b[1]
等)。
我知道我可以寫出很多if
語句,但是我希望有一種更優雅的方法。
檢查每個列表元素后,我想知道找到一個共享值的次數(在上面的示例列表中,它是一次'5'
)。
編輯:這不是重復項,b / ci將兩個不同的列表相互比較,而可能的重復項僅處理了一個列表。
list
的count()
方法可能會有所幫助:
>>> a = ['5', '2', '3', '4']
>>> b = ['1', '6', '7', '5']
>>> for item in a:
... print item, b.count(item)
...
5 1
2 0
3 0
4 0
大輸入可能比eugene y更快,因為它只需要對b
一次迭代,
而不是len(a)
次:
from collections import Counter
counts = Counter(b)
for i in a:
print(i, counts[i])
如果僅關注共享值,而不關注它們的位置或計數,請將其轉換為set
並使用intersection
:
>>> a = ['5','2','3','4']
>>> b = ['1','6','7','5']
>>> set(a).intersection(b)
{'5'}
如果要保留元素在相交中出現的頻率,還可以對collections.Counter
進行相交。使用&
>>> a = ['5','2','3','4','1','1','6','5']
>>> b = ['1','6','7','5','5']
>>> collections.Counter(a) & collections.Counter(b)
Counter({'5': 2, '1': 1, '6': 1})
注意:這與@GingerPlusPlus的解決方案不同,因為它是對稱的,即,如果在列表a
存在5
a
,在列表b
,則共享計數將為1
,而不是2
。
def cmp(*lists):
lists_len_min = list(map(lambda x: len(x), lists))
if min(lists_len_min) != max(lists_len_min):
raise Exception("Lists must have equal length")
iterator = iter(lists)
last = next(iterator)
for element in iterator:
for i, each in enumerate(element):
#print(i, last[i], each)
if last[i] != each:
return False
else:
return True
此功能可以比較相等長度的任意多個列表。 只需調用cmp(list1,list2,list3)
這段代碼將產生包含在a
和b
列表中的元素列表
a = [1,2,3,4]
b = [2,3,1,7]
c = [e for e in a if e in b]
如果使用大數組,則內存可能會很復雜,但是如果您打算使用此數據,那為什么不呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.