列表理解中的不同行为

时间:2016-07-17 09:48:39

标签: python-3.x

在我看来,这两段代码做同样的事情:

l = [[1,2], [3,4],[3,2], [5,4], [4,4],[5,7]]

1)

In [4]: [list(g) for k,g in groupby(sorted(l,key=lambda x:x[1]),
    key = lambda x:x[1]) if len(list(g)) == 2]
Out[4]: [[]]

2)

In [5]: groups = [list(g) for k,g in groupby(sorted(l, 
    key=lambda x:x[1]), key = lambda x:x[1])]

In [6]: [g for g in groups if len(g) == 2]
Out[6]: [[[1, 2], [3, 2]]]

但正如你所看到的那样,第一个给出一个空列表,而第二个给出了我需要的东西。我错在哪里?

1 个答案:

答案 0 :(得分:2)

group是一个迭代器,你不能消耗它(例如通过调用它上面的list)两次。例如:

>>> from operator import itemgetter
>>> from itertools import groupby
>>> l = [[1,2], [3,4],[3,2], [5,4], [4,4],[5,7]]
>>> for _, group in groupby(sorted(l, key=itemgetter(1)), key=itemgetter(1)):
...     print('first', list(group))
...     print('second', list(group))
...
first [[1, 2], [3, 2]]
second []
first [[3, 4], [5, 4], [4, 4]]
second []
first [[5, 7]]
second []

相反,您需要为每个组调用list一次并过滤其结果,例如:使用map

>>> [lst for lst in map(list, (group for _, group in groupby(sorted(l, key=itemgetter(1))), key=itemgetter(1))) if len(lst) == 2]
[[[1, 2], [3, 2]]]