Python 使用集合(列表)理解的对称集合差异未给出预期结果

Python 使用集合(列表)理解的对称集合差异未给出预期结果,python,set,list-comprehension,Python,Set,List Comprehension,我正在学习python,希望了解这里发生了什么。我肯定我错过了一些基本的东西。我从两个列表中获取元素,但这两个列表中都没有显示。以下是我的输出代码: l = [1, 8, 3, 4] m = [4, 6, 3, 8] Method 1: r = list(set(l) - set(m)) + list(set(m) - set(l)) [1, 6] Method 2: print [(x,y) for x in l for y in m

我正在学习python,希望了解这里发生了什么。我肯定我错过了一些基本的东西。我从两个列表中获取元素,但这两个列表中都没有显示。以下是我的输出代码:

    l = [1, 8, 3, 4]
    m = [4, 6, 3, 8]

    Method 1:
    r = list(set(l) - set(m)) + list(set(m) - set(l))
    [1, 6]

    Method 2:
    print [(x,y) for x in l for y in m if x not in m and y not in l]
    [(1, 6)]

    Method 3 (same but returns a list):
    print [[x,y] for x in l for y in m if x not in m and y not in l]
    [[1, 6]]
我想要一个列表理解,它将返回与方法1返回的列表相同的列表

另外,据我所知,我得到了一个生成器,作为列表理解中代码的结果。但是,我无法将其转换为一个简单的列表:

    res = ((x,y) for x in l for y in m if x not in m and y not in l)
    print list(res)
    [(1, 6)]
为什么呢?我期待着:

    [1, 6]
编辑:我的主要问题是:为什么我不能将生成器从上面的列表理解转换为列表?根据使用
列表(res)中接受的答案,
应该有效。我想理解为什么它不存在。

list(set(l)-set(m))+list(set(m)-set(l))
是一种寻找两个集合之间的差异(“位于任一集合中但不在其交叉点的元素集合”-维基百科)的方法


总之,通过列表理解,我会这样做:

>>> {el for (this,other) in [(m,l),(l,m)] for el in this if el not in other}
{1, 6}
这和

>>> symdif = set()
>>> for this,other in [(m,l),(l,m)]:
...     for el in this:
...          if el not in other:
...              symdif.add(el)
...
>>> symdif
{1, 6}

…我并不推荐它。

这是因为您将生成器转换为列表

所以它将相当于一个列表理解

另一个选择是:

list(set(l)^set(m))

很短很好。

@U9向前,这是对称的区别。我没有这样做的原因是因为我不想把l和m都转换成一个集合来计算它。使用
symmetric\u difference
,我不必将两者都转换,只需一个。@coldspeed:Note:
symmetric\u difference
在当前的CPython实现中转换为
set
,所以不管你做什么,你最终都会得到临时
set
。@ShadowRanger True,但该函数为我做了。。。。可能只有我,但我发现函数调用更干净。。。必须是我的熊猫背景。:-)这就是我从symmetric_difference:set([1,6])中得到的结果。我很困惑,它是一个包含两个元素的列表的集合吗?我使用的是python 2.7,如果有区别的话。@Lidia通过运行
list(…)
将其转换为一个列表。注意:
list(set(l)^set(m))
不会保留基于原点集的偏序,而
list(set(l)-set(m))+list(set(m)-set(l))
会这样做,所以它可能不合适,但如果排序不重要,是的,这显然是最好的解决方案。这是一个很好的解决方案(不保留顺序),但是,我仍然不明白为什么我不能将列表理解的输出转换为一个简单的列表。这是我的问题。本文中公认的答案是,您可以通过执行
list(gen)
从生成器中获取列表,那么为什么它不能与我的生成器一起工作呢?
list(set(l)^set(m))