python 2 strange list comprehension behaviour

后端 未结 2 1699
日久生厌
日久生厌 2021-01-18 08:04

I was looking around list comprehension and saw smth strange. Code:

a = [\'a\', \'a\', \'a\', \'b\', \'d\', \'d\', \'c\', \'c\', \'c\']
print [(len(list(g)),         


        
2条回答
  •  没有蜡笔的小新
    2021-01-18 08:49

    You need to ensure the elements of g are consumed only once:

    >>> print [(len(list(g)), k) if len(list(g)) > 1 else k for k, g in ((k, list(g)) for k, g in groupby(a))]
    [(3, 'a'), 'b', (2, 'd'), (3, 'c')]
    

    This code will also iterate over k, g in groupby(a) but it'll turn g into a list object. The rest of the code can then access g as many times as needed (to check the length) without consuming the results.

    Before making this change, g was a itertools._grouper object which means that you can iterate over g only once. After that it'll be empty and you won't be able to iterate over it again. That's why you're seeing length 0 appear in your results.

提交回复
热议问题