【问题标题】:Removing specific tuples from List从列表中删除特定元组
【发布时间】:2013-10-06 17:24:09
【问题描述】:

我有一个清单

a = [(1,2),(1,4),(2,6),(1,8),(3,6),(1,10),(1,6)]

如果我这么说:

for x in a:
    if x[0]==1:
        print x

我得到了预期的结果:(1,2) (1,4) (1,8) (1,10) (1,6)

但是我想删除格式为 (1,x) 的所有元组的所有出现,所以

for x in a:
   if x[0]==1:
       a.remove(x)

我认为应该删除所有发生的事情。但是当我说

Print a

我得到 [(1,4),(2,6),(3,6),(1,6)]

并非所有元组都被删除。我该怎么做。?? 谢谢

【问题讨论】:

    标签: python list tuples


    【解决方案1】:

    我会使用list comprehension:

    def removeTuplesWithOne(lst):
        return [x for x in lst if x[0] != 1]
    
    a = removeTuplesWithOne([(1,2),(1,4),(2,6),(1,8),(3,6),(1,10),(1,6)])
    

    对我来说,它比内置的 filter 函数更 Pythonic。

    附:此功能不会更改您的原始列表,它会创建新列表。如果您的原始列表很大,我可能会像这样使用generator expression

    def removeTuplesWithOne(lst):
        return (x for x in lst if x[0] != 1)
    

    【讨论】:

    • 这个是更好的解决方案
    【解决方案2】:

    这与您的方法不同,但应该可行

    a = filter(lambda x: x[0] != 1, a)
    

    【讨论】:

      【解决方案3】:

      您可以像这样使用list comprehension,过滤掉以1为第一个元素的项目。

      >>> original = [(1, 2), (1, 4), (2, 6), (1, 8), (3, 6), (1, 10), (1, 6)]
      >>> [item for item in original if item[0] != 1]
      [(2, 6), (3, 6)]
      

      这将创建一个新列表,而不是修改现有列表。 99% 的情况下,这会很好,但如果您需要修改原始列表,您可以通过分配回:

      original[:] = [item for item in original if item[0] != 1]
      

      这里我们使用切片分配,它的工作原理是将原始列表([:])从开始到结束的每个项目替换为列表理解中的项目。如果您只是使用普通赋值,您只需更改名称 original 指向的内容,而不是实际修改列表本身。

      【讨论】:

      • 但我想,他想从列表中删除。您的代码会从列表中删除它们吗?
      • 如果实际需要修改原始列表(99% 的情况下不会),您始终可以分配回原始列表。 original[:] = new。我已经编辑了一些格式并添加了解释。
      • 投反对票的原因是?
      【解决方案4】:

      如果您要处理大量数据,则可以使用 generator 表达式来完成:

      a = [(1,2),(1,4),(2,6),(1,8),(3,6),(1,10),(1,6)]
      
      # create a generator
      a = ((x,y) for x, y in a if x == 1)
      
      # simply convert it to a list if you need to...
      >>> print list(a)
      [(1, 2), (1, 4), (1, 8), (1, 10), (1, 6)]
      

      【讨论】:

        猜你喜欢
        • 2022-11-14
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-13
        相关资源
        最近更新 更多