【问题标题】:Delete last N elements if they are 0 and constant如果最后 N 个元素为 0 且为常量,则删除它们
【发布时间】:2018-12-12 09:36:10
【问题描述】:

我有一个数组,例如

data = [
  [1, 0],
  [2, 0],
  [3, 1], 
  [4, 1], 
  [5, 1],
  [6, 0],
  [7, 0]]

我希望结果是

verified_data = [[1, 0], [2, 0], [3, 1]]

那么,如果最后一个元素为 0,以及最后 N 个元素是否相同(第一个 1 除外),我该如何删除它们。实现这一目标的正确方法是什么?使用 numpy 也可以。

编辑,因为我已经写了一个解决方案,即使它看起来很丑:

def verify_data(data):
    rev_data = reversed(data)
    for i, row  in list(enumerate(rev_data )):
            if row[1] == 0:
                del data[- 1]
            else:
                break
    rev_data = reversed(data)
    last_same_data = None
    for i, row in list(enumerate(rev_data)):
            if not last_same_data:
                last_same_data = row[1]
                continue
            if last_same_data == row[1]:
                del data[-1]
            else:
                break
    return data

【问题讨论】:

  • 结果/解释不清楚。你能详细说明一下吗?
  • 你能再解释一下这背后的逻辑吗?我不明白你到底想做什么。在这种情况下,“恒定”是什么意思?
  • 不变,我的意思是它不会改变。如果最后一个元素都是 1, 1, 1, 1 那么我只需要第一个 1 的索引并丢弃其余的。对不起,我的解释很糟糕。
  • 通过连接,你的意思是删除?第一指数的利益是什么?只是为了重新定位吗?因为没有它,工作会更容易(也更快)。
  • 哦,我把这些词弄糊涂了。应该删除,而不是连接。

标签: python arrays algorithm numpy


【解决方案1】:

我已将删除尾随零和删除尾随重复项拆分为两个函数。使用 list[-n] 索引来避免显式索引跟踪。

In [20]: def remove_trailing_duplicates(dat):
    ...:     key=dat[-1][1]
    ...:     while (len(dat)>1) and (dat[-2][1]==key):
    ...:         dat.pop() # Remove the last item.
    ...:         key=dat[-1][1]  # Reset key to last item.

In [21]: def remove_trailing_zeros(dat):
            # len(dat)>0 can give an empty list, >1 leaves at least the first item 
    ...:     while len(dat)>0 and dat[-1][1]==0: 
                 dat.pop()

In [22]: data = [
    ...:   [1, 0],
    ...:   [2, 0],
    ...:   [3, 1],
    ...:   [4, 1],
    ...:   [5, 1],
    ...:   [6, 0],
    ...:   [7, 0]]

In [23]: remove_trailing_zeros(data)
In [24]: data
Out [24]: [[1, 0], [2, 0], [3, 1], [4, 1], [5, 1]]

In [25]: remove_trailing_duplicates(data)
In [26]: data
Out[26]: [[1, 0], [2, 0], [3, 1]]

这适用于您在问题中使用的数据,并检查重复功能中仅剩下一项。对于 [n, 0]? 的所有数据项,您想要什么是空列表或剩余的第一项?

HTH

【讨论】:

  • 如果所有数据元素都是 [n, 0],这实际上会崩溃。
  • 现已更正。 remove_trailing_zeros 现在更健壮了。
  • 我检查的第一件事是,如果它们都为零,则返回空数组。但我猜你的代码也能处理这个问题。感谢漂亮的代码!
  • 很高兴为您提供帮助。我认为 remove_trailing_duplicates 可以改进。它不需要分配到键。
猜你喜欢
  • 2019-05-29
  • 2020-07-17
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 2017-05-06
  • 2023-02-09
  • 1970-01-01
  • 2014-02-28
相关资源
最近更新 更多