我试图比较两个列表并找到该位置并改变该位置的角色。例如,这些是两个列表:
db.alumni.aggregate([
{$match: {_id: 'john'}},
{$unwind:"$items"},
{$unwind:"$items.items"},
{$lookup: {
from: 'schools',
localField: 'items.items.school',
foreignField: '_id',
as: 'schoolInfo'}},
{$unwind:"$schoolInfo"},
{$project:{
"_id":1,
"items":[{
"name":"$items.name",
"items":[{
"school":"$schoolInfo._id" ,
"grad":"$items.items.grad" ,
"schoolInfo":"$schoolInfo"
}]
}]
}}
]).pretty()
我希望能够输出位置并更改两个列表中的差异。如您所见,一个字母可以在不同的索引位置重复多次。这是我尝试的代码,但我似乎无法准确地打印出第二个位置。
list1 = ['I', 'C', 'A', 'N', 'R', 'U', 'N']
list2 = ['I', 'K', 'A', 'N', 'R', 'U', 'T']
有没有更好的方法来解决这个问题或对我的代码提出任何建议?
我的预期输出是:
for indexing in range(0, len(list1)):
if list1[indexing] != list2[indexing]:
dontuseindex = indexing
poschange = indexing + 1
changecharacter = list2[indexing]
for indexingagain in range(dontuseindex + 1, len(list1)):
if list1[indexingagain] != list2[indexingagain]:
secondposchange = indexingagain + 1
secondchangecharacter = list2[indexingagain]
答案 0 :(得分:7)
for index, (first, second) in enumerate(zip(list1, list2)):
if first != second:
print(index, second)
输出:
1 K
6 T
如果您想要提供的输出,我们需要从1
而不是通常的0
计算:
for index, (first, second) in enumerate(zip(list1, list2), start=1):
答案 1 :(得分:4)
使用索引保存所有不相等元素的另一种可能性是列表推导:
list1 = ['I', 'C', 'A', 'N', 'R', 'U', 'N']
list2 = ['I', 'K', 'A', 'N', 'R', 'U', 'T']
# Append index, element1 and element2 as tuple to the list if they are not equal
changes = [(i, list1[i], list2[i]) for i in range(len(list1)) if list1[i] != list2[i]]
print(changes)
#prints [(1, 'C', 'K'), (6, 'N', 'T')]
不完全是您指定的输出但它已关闭。
您可以使用循环打印指定的输出:
for i in changes:
print(i[0] + 1, i[1])
# 2 K
# 7 T
在评论中提出了几种设计列表理解的替代方法:
使用enumerate
和zip
:
changes = [(i, e1, e2) for i, (e1, e2) in enumerate(zip(list1, list2)) if e1 != e2]
将enumerate
与起始索引和zip
一起使用:
changes = [(i, e1, e2) for i, (e1, e2) in enumerate(zip(list1, list2), 1) if e1 != e2]
使用zip
和itertools.count
:
import itertools
changes = [(i, e1, e2) for i, e1, e2 in zip(itertools.count(), list1, list2)) if e1 != e2]
将zip
和itertools.count
与start-index:
changes = [(i, e1, e2) for i, e1, e2 in zip(itertools.count(1), list1, list2)) if e1 != e2]
所有这些都产生与原始相同的结果,但使用不同的(更好的)python功能。