比较两个列表并找到变化的指标

时间:2016-03-15 22:49:53

标签: python list

我试图比较两个列表并找到该位置并改变该位置的角色。例如,这些是两个列表:

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]

2 个答案:

答案 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

在评论中提出了几种设计列表理解的替代方法:

  • 使用enumeratezip

    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]
    
  • 使用zipitertools.count

    import itertools
    changes = [(i, e1, e2) for i, e1, e2 in zip(itertools.count(), list1, list2)) if e1 != e2]
    
  • zipitertools.count与start-index:

    一起使用
    changes = [(i, e1, e2) for i, e1, e2 in zip(itertools.count(1), list1, list2)) if e1 != e2]
    

所有这些都产生与原始相同的结果,但使用不同的(更好的)python功能。