【问题标题】:Remove multiple elements from a list of index with Python使用 Python 从索引列表中删除多个元素
【发布时间】:2015-06-16 18:34:35
【问题描述】:

我有一个值列表和一个索引列表,我需要删除索引指向的元素。

这是我的解决方案,但我不喜欢实现,因为它需要导入包,当值包含 maxint 时不起作用,并且多次迭代这些值。

def remove_abnormalities(values, indices):
    v = list(values)
    for i in indices:
        v[i] = sys.maxint
    return filter(lambda i: i != sys.maxint, v)

有更好的解决方案吗?

【问题讨论】:

    标签: python list collections


    【解决方案1】:

    这应该可行:

    def remove_abnormalities(values, indices):
        return [val for i, val in enumerate(values) if i not in indices]
    

    此外,如果索引的数量很大,您可以在过滤之前将indices 转换为一个集合以获得更高的性能。

    【讨论】:

    • [values[i] for i in range(len(values)) if i not in indices][val for i, val in enumerate(values) if i not in indices] 好还是相反?
    • @ZekeDran 后者被认为更 Pythonic。
    【解决方案2】:

    这是一个仅使用内置列表方法的版本。

    这是相当幼稚的,所以可能有更快的解决方案,但不需要额外的包等,这可能是你需要的。

    def remove_abnormalities(values, indices):
        list = []
        for i in range(len(values)):
            if i not in indices:
               list.append(values[i])
        return list
    
    print(remove_abnormalities(["A","B","C","D","E","F","G","H"],[1,3,5]))
    #output is ['A', 'C', 'E', 'G', 'H']
    

    如果有其他 Python 专家愿意建议对此进行编辑/优化,请随意。

    编辑

    我尝试在花哨的实现和我的幼稚实现中都使用timeit 函数,它们不是决定性的,但一个似乎并不比另一个快。不过,这是在解释器中手动完成的。无法使脚本正常工作。就性能而言,它们相差不大。不过我不介意别人能证明我错了!

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 2010-10-04
      • 1970-01-01
      • 2016-12-03
      • 2010-10-12
      相关资源
      最近更新 更多