我对这个问题很好奇:消除列表元素的连续重复,以及如何在Python中实现它.
我想出的是:
list = [1,1,1,1,1,1,2,3,4,4,5,1,2]
i = 0
while i < len(list)-1:
if list[i] == list[i+1]:
del list[i]
else:
i = i+1
Run Code Online (Sandbox Code Playgroud)
输出:
[1, 2, 3, 4, 5, 1, 2]
Run Code Online (Sandbox Code Playgroud)
我觉得还可以.
所以我很好奇,想看看我是否可以删除连续重复的元素并获得此输出:
[2, 3, 5, 1, 2]
Run Code Online (Sandbox Code Playgroud)
为此我做了这个:
list = [1,1,1,1,1,1,2,3,4,4,5,1,2]
i = 0
dupe = False
while i < len(list)-1:
if list[i] == list[i+1]:
del list[i]
dupe = True
elif dupe:
del list[i]
dupe = False
else:
i += 1
Run Code Online (Sandbox Code Playgroud)
但它似乎有点笨拙而不是pythonic,你有更智能/更优雅/更有效的方式来实现它吗?
有没有办法在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)
有任何想法吗?
基本上,我需要一种方法将控制返回到for循环的开头,并且如果满足某个条件,则在采取操作后实际重新启动整个迭代过程.
我想要做的是这样的:
for index, item in enumerate(list2):
if item == '||' and list2[index-1] == '||':
del list2[index]
*<some action that resarts the whole process>*
Run Code Online (Sandbox Code Playgroud)
这样,如果['berry','||','||','||','pancake'在列表中,我将结束:
['berry','||','pancake']相反.
谢谢!
我有一个如下所示的列表
a = [5,5,5,5,3,3,2,2,2,2,5,5,5,2,2,2,2,2]
Run Code Online (Sandbox Code Playgroud)
我希望有以下输出列表
b = [5,3,2,5,2]
Run Code Online (Sandbox Code Playgroud)
请注意,我曾尝试使用
list(OrderedDict.fromkeys(a))
Run Code Online (Sandbox Code Playgroud)
这给了我
[5, 3, 2]
Run Code Online (Sandbox Code Playgroud)
请注意,它不考虑第 2 个 5 或第 2 个 2,因为到那时它们是非唯一的。
我需要一种方法让机器理解当它遇到一个唯一元素(比如第一个“5”)时,它应该将它存储在列表 b 中。因此,当它遇到第一个 '3' 或第一个 '2' 时,它也应该将它们存储在列表 b 中。到目前为止没有问题。当它遇到第二组“5”时,它应该将该 5 作为新元素存储在列表 b 中。第二组 2 也是如此。
有没有 Pythonic 的方法来做到这一点?