简体   繁体   English

python比较两个列表之间的差异

[英]python compare difference between two lists

I have two lists like this: 我有两个这样的清单:

newList = (
    (1546, 'John'),
    (8794, 'Michael'),
    (892416, 'Dave'),
    (456789, 'Lucy'),
    )

oldList = (
    (1546, 'John'),
    (8794, 'Michael'),
    (892416, 'Dave'),
    (246456, 'Alexander')
    )

I would like to have a function comparing both lists. 我想有一个比较两个列表的函数。 It would be something like this: 就像这样:

def compare(new, old):
    print('Alexander is not anymore in the new list !')
    print('Lucy is new !')
    return newList 

I would like to compare with id of every person which is unique. 我想与每个人的ID进行比较。

Edit: The result would be my function compare. 编辑:结果将是我的功能比较。 It prints the difference. 它打印出差异。 I don't know how to start 我不知道怎么开始

You can convert your lists into sets and take the differences 您可以将列表转换成集合并进行区别

n = set(l[1] for l in newList)
o = set(l[1] for l in oldList)
print n - o # set(['Lucy'])
print o - n # set(['Alexander'])

edit: I wrote this before I know a lot about sets. 编辑:我写这是在我不了解集合之前。 Now I would recommend the solution using sets given below. 现在,我将建议使用下面给出的集合的解决方案。

One solution: 一种解决方案:

removed = [o for o in old if o[0] not in [n[0] for n in new]]
added = [n for n in new if n[0] not in [o[0] for o in old]]

Or if you present your data as dictionaries: 或者,如果您将数据显示为字典:

old = dict(old) # if you do go for this approach be sure to build these
new = dict(new) # variables as dictionaries, not convert them each time

removed = {k:old[k] for k in old.keys() - new.keys()}
added = {k:new[k] for k in new.keys() - old.keys()}

Both turned into functions, returning items in ys but not in xs : 两者都变成了函数,以ys返回项目,但没有以xs返回项目:

def tuple_list_additions(xs,ys):
  return [y for y in ys if y[0] not in [x[0] for x in xs]]

def dict_additions(xs,ys):
  return {k:ys[k] for k in ys.keys() - xs.keys()}

You can use set : 您可以使用set

def compare(old, new):
    oldSet = set(old)
    newSet = set(new)
    removedElements =  oldSet - newSet
    newElements = newSet - oldSet
    for element in removedElements:
        print(element[1] + " is not anymore in the new list!")
    for element in newElements:
        print(element[1] + " is new!")

It's method which compares whole elements (id, name), so if you want to compare only id you should do some modifications (and for example use dicts). 它是一种比较整个元素(id,name)的方法,因此,如果您只想比较id,则应该进行一些修改(例如使用dicts)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM