【问题标题】:How to remove values from a list that are less than a target value from the previous number如何从列表中删除小于前一个数字的目标值的值
【发布时间】:2016-05-30 23:09:09
【问题描述】:

给定一个递增数字的排序列表,我正在尝试创建一个新列表,该列表仅保留比前一个数字至少大 3 的值。我尝试了一些条件语句,但未能获得正确的格式。例如,来自

a = [3,4,8,12,14,16]

我们会得到

new_a = [3,8,12,16]

只有 14 会退出,因为它距离 12 小于 3,但保留 16,因为它大于 12 的 3。4 也会退出。任何帮助将不胜感激!

【问题讨论】:

  • 如果列表确实已排序,您可以将之前的值存储为临时变量并对其进行检查,直到它变大 3。
  • 你能显示你试过的代码吗?
  • [2,4,6,8,10,12] 的结果应该是什么?
  • 这将给出 [2, 6, 10]
  • 为什么不[4,8,12,16][4,8,12]?规则是什么:您想获得尽可能长的列表,还是贪婪地淘汰下一个太近的列表?

标签: python list


【解决方案1】:

应该这样做:

new_a = a[:1]
for i in a[1:]:
    if i >= new_a[-1] + 3:
        new_a.append(i)

【讨论】:

  • @sparkandshine: 那必须是new_a = [a[0]],因为它必须是一个包含 a 的第一个元素的列表。不确定这是否更简单,但我都可以。
【解决方案2】:
a = [3,4,8,12,14,16]
b = a[:1]
last_num = b[0]
for num in a:
    if last_num is not None and last_num + 3 <= num:
        b.append(num)
        last_num = num

print(b)

【讨论】:

  • if last_num is not None 是必需的,因为它目前无法处理 0。
  • 我很好奇。在 if 语句的第一部分中,您使用 last_num 来查看您是否正在查看列表 a 中的第一项,但在第二部分中您使用 len(b)。为什么会发生变化?
  • b 列表中添加第一项..我修复了它,但我认为 Tim Hoffmann 解决方案要好得多
【解决方案3】:

可能有点矫枉过正,但如果你最终做了大量的计算(以及向列表中添加新数字),你可以尝试子类化list

class Newlist(list):
    def __init__(self, *args):
        super(Newlist, self).__init__(*args)
        if len(self) > 0:
            i = 1
            while i<len(self):
                if self.__getitem__(i) < 3+self.__getitem__(i-1):
                    self.remove(self.__getitem__(i))
                i += 1

    def append(self, item):
        if len(self) == 0:
            super(Newlist, self).append(item)
        elif item >= self.__getitem__(-1) + 3:
            super(Newlist, self).append(item)
        else: return

因此你可以用

初始化一个列表
a = Newlist([3, 4, 8, 12, 14, 16])

会自动缩短为[3, 8, 12, 16]

还覆盖append 以仅允许遵循您的规则的新值。示例:a.append(20) 会将20 添加到a 的末尾,但a.append(17) 不会执行任何操作。

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多