寻找更多pythonic列表比较解决方案

Pea*_*ion 5 python list

好的,我有两个清单:

x = [1, 2, 3, 4]
y = [1, 1, 2, 5, 6]
Run Code Online (Sandbox Code Playgroud)

我以这种方式比较它们,所以我得到以下输出:

x = [3, 4]
y = [1, 5, 6]
Run Code Online (Sandbox Code Playgroud)

基本的想法是浏览每个列表并进行比较.如果他们有一个共同的元素删除该元素.但只有一个元素不是全部.如果他们没有共同的元素就离开它.两个相同的列表将变为x = [],y = []

这是我相当黑客和相当蹩脚的解决方案.我希望其他人可以推荐更好的和/或更多的pythonic方式来做到这一点.3个循环似乎过多......

    done = True

    while not done:
        done = False
        for x in xlist:
            for y in ylist:
                if x == y:
                    xlist.remove(x)
                    ylist.remove(y)
                    done = False
        print xlist, ylist
Run Code Online (Sandbox Code Playgroud)

一如既往地感谢您花时间阅读这个问题.XOXO

Gar*_*ees 7

您正在寻找的数据结构可能是多集(或"包"),如果是这样,在Python中实现它的一种好方法是使用collections.Counter:

>>> from collections import Counter
>>> x = Counter([1, 2, 3, 4])
>>> y = Counter([1, 1, 2, 5, 6])
>>> x - y
Counter({3: 1, 4: 1})
>>> y - x
Counter({1: 1, 5: 1, 6: 1})
Run Code Online (Sandbox Code Playgroud)

如果要将Counter对象转换回具有多重性的列表,可以使用以下elements方法:

>>> list((x - y).elements())
[3, 4]
>>> list((y - x).elements())
[1, 5, 6]
Run Code Online (Sandbox Code Playgroud)