【问题标题】:Remove specific consecutive duplicate in a list [duplicate]删除列表中的特定连续重复项[重复项]
【发布时间】:2020-04-15 07:12:54
【问题描述】:

帖子类似于this,但我想要的是删除列表中特定的连续重复项。 所以假设我们有这个列表:

[1,1,1,2,2,3,2,4,4,4,1]

我想拥有:

[1,2,2,3,2,4,4,4,1]

我只想删除“那些”。我正在尝试itertools.groupby,但我还没有找到方法。

【问题讨论】:

  • 这是什么逻辑?你想删除所有重复的吗?字符串开头的所有重复项?无论值如何,字符串开头的所有重复项?
  • 最终它与副本中的解决方案非常相似;使用groupby,返回元组喜欢(1, (1, 1, 1)),你只需要根据是1来决定是使用第一项还是第二项……
  • 模式是:凡是重复的“1”都应该去掉。另一个例子:从 [1,1,1,2,2,3,2,1,1,4,4,4,1,1,1,1] 到 [1,2,2,3,2,1 ,4,4,4,1]

标签: python duplicates itertools


【解决方案1】:

您可以使用itertools.groupby 并使用分组密钥来保留密钥或保留返回的组:

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

from itertools import chain, groupby

list(chain.from_iterable([k] if k==1 else v for k,v in groupby(l)))
# [1, 2, 2, 3, 2, 4, 4, 4, 1]

【讨论】:

  • 不错,还有一种类似的方法sum([[1] if i==1 else list(j) for i,j in groupby(a)],[])
  • 请注意,虽然@Nagakiran 并不真正推荐使用 sum 进行展平,但它的复杂性比必要的要高
【解决方案2】:

如果您在列表的开头搜索那些,则不需要导入模块来执行此操作,也可以在 for 循环中迭代元素:

your_list = [1,1,1,2,2,3,2,4,4,4,1]
for index, element in enumerate(your_list):
    if element != 1:
        break
if index:
    result = your_list[index-1:]
else:
    result = your_list

这将检查一个,直到找到另一个数字。另一个数字 -1 的索引是列表的开头。

如果列表中没有 1,index 将为零并返回原始列表。

【讨论】:

  • 请注意,这假设搜索到的值位于列表的开头,并且假设只有第一次出现的值应该被删除(这个要求不清楚)......
  • 哦,谢谢,我假设并会编辑我的答案
猜你喜欢
  • 1970-01-01
  • 2021-05-12
  • 2011-07-23
  • 2016-01-19
  • 2014-04-19
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多