Dav*_*ked 20 python list-comprehension list
有没有办法在python中使用列表推导来过滤列表中的相邻重复项?
这是我的意思的一个例子:
>>> xs = [1,2,2,3]
>>> print added.reAdj(xs)
[1,2,3]
Run Code Online (Sandbox Code Playgroud)
通过SE进行的搜索揭示了早先的一个问题,询问了一个类似但略有不同的问题:是否可以从列表中删除所有重复项,而不是明确要求涉及列表推导的解决方案.使用列表推导的动机特别在于认识到它们优于传统for循环的优点.用户建议使用set()函数或标准循环:
result = []
most_recent_elem = None
for e in xs:
if e != most_recent_elem:
result.append(e)
most_recent_elem = e
Run Code Online (Sandbox Code Playgroud)
该set()建议无法满足任务,因为删除了非相邻重复项,而循环有效但冗长.
这似乎是一种安全地引用列表推导中的下一个元素的方法,如下所示.
[x for x in xs if x != **x.next()**]
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
fal*_*tru 30
你可以使用itertools.groupby:
>>> import itertools
>>> [key for key, grp in itertools.groupby([1, 2, 2, 3])]
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
itertools.groupby返回一个迭代器.通过迭代,您将获得一个关键的组对.(key如果没有key指定函数,则为项目,否则为key函数的返回值).group是一个迭代器,它将生成通过应用key函数分组的项目(如果未指定,将对相同的值进行分组)
>>> import itertools
>>> it = itertools.groupby([1, 2, 2, 3])
>>> it
<itertools.groupby object at 0x7feec0863048>
>>> for key, grp in it:
... print(key)
... print(grp)
...
1
<itertools._grouper object at 0x7feec0828ac8>
2
<itertools._grouper object at 0x7feec0828b00>
3
<itertools._grouper object at 0x7feec0828ac8>
>>> it = itertools.groupby([1, 2, 2, 3])
>>> for key, grp in it:
... print(list(grp))
...
[1]
[2, 2]
[3]
Run Code Online (Sandbox Code Playgroud)
以上解决方案,我key之所以使用,只是因为问题并不关心相邻的项目数量.
Ant*_*pov 20
您可以使用list comprehension,并enumerate通过@AChampion建议的解决方案:
xs = [1,2,2,2,1,1]
In [115]: [n for i, n in enumerate(xs) if i==0 or n != xs[i-1]]
Out[115]: [1, 2, 1]
Run Code Online (Sandbox Code Playgroud)
该列表理解返回项目,如果它是第一个或如果它不等于之前的下一个.由于对if语句的懒惰评估,它会起作用.
使用itertools配方中的pairwise(使用zip_longest)可以轻松检查下一个元素:
import itertools as it
def pairwise(iterable):
a, b = it.tee(iterable)
next(b, None)
return it.zip_longest(a, b, fillvalue=object()) # izip_longest for Py2
>>> xs = [1,2,2,3]
>>> [x for x, y in pairwise(xs) if x != y]
[1, 2, 3]
>>> xs = [1,2,2,2,2,3,3,3,4,5,6,6]
>>> [x for x, y in pairwise(xs) if x != y]
[1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4019 次 |
| 最近记录: |