将 2 个列表的所有元素与 Python 进行比较 2
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[0] == b[0]
、a[0] == b[1]
等)。
我知道我可以写出许多 if
语句,但我希望有更优雅的方法来做到这一点。
检查每个列表元素后,我想知道找到共享值的次数(在我上面的示例列表中,应该是一次,'5'
)。
编辑:这不是重复的,b/c我正在相互比较两个不同的列表,而可能的重复只处理了 1 个列表。
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
如果您只关心共享值,而不关心它们的位置或计数,请将它们转换为 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 的解决方案不同,因为它是对称的,即如果 5
在列表 a
中出现一次,在列表 b
中出现两次,则共享计数将是 1
,而不是 2
。
大输入可能比 更快,因为它只需要迭代 b
一次,
而不是 len(a)
次:
from collections import Counter
counts = Counter(b)
for i in a:
print(i, counts[i])
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]
如果你使用大数组,内存可能会很复杂,但如果你打算使用这些数据,为什么不呢
我有 2 个列表:a = ['5', '2', '3', '4']
和 b = ['1', '6', '7', '5']
。使用 Python 2,如何将 a
中的每个列表元素与 b
中的每个元素进行比较? (即 a[0] == b[0]
、a[0] == b[1]
等)。
我知道我可以写出许多 if
语句,但我希望有更优雅的方法来做到这一点。
检查每个列表元素后,我想知道找到共享值的次数(在我上面的示例列表中,应该是一次,'5'
)。
编辑:这不是重复的,b/c我正在相互比较两个不同的列表,而可能的重复只处理了 1 个列表。
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
如果您只关心共享值,而不关心它们的位置或计数,请将它们转换为 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 的解决方案不同,因为它是对称的,即如果 5
在列表 a
中出现一次,在列表 b
中出现两次,则共享计数将是 1
,而不是 2
。
大输入可能比 b
一次,
而不是 len(a)
次:
from collections import Counter
counts = Counter(b)
for i in a:
print(i, counts[i])
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]
如果你使用大数组,内存可能会很复杂,但如果你打算使用这些数据,为什么不呢