如何在列表中删除项目及其信息?

时间:2015-12-25 01:06:47

标签: python python-3.x

我有以下列表:

   lst= ['Jason', 999999999, 'jason@live.com', 'Curt', 333333333, 'curt@job.com']

我想删除Jason以及接下来的两个条目以及以下条目,所以我在想这个:

for i in range(len(lst)):
    if "Jason" in lst:
        del lst[0]
        del lst[1]
        del lst[2]
    else:
        print("Jason not in lst")

这是对的吗?

感谢Tigerhawk,我的工作如下:

原始列表:

 lst = `[['Curt', 333333333, 'curt@job.com'], ['Jason', 999999999, 'jason@live.com']]`

def clean_lst(lst):
    name=str(input("Name you want to delete:")) #With this I get the lst on the 1st paragraph
    lst = sum(lst, [])
    if len(lst)==0:
        print("Empty List")
    elif name in lst:
        idx = lst.index(name)
        del lst[idx:idx+3]
    else: 
        print("Name is not on the list")

最终结果应如下所示:

lst = `[['Curt', 333333333, 'curt@job.com']]`

2 个答案:

答案 0 :(得分:2)

如果您可以有多个,请从列表的末尾开始,如果i等于杰森,则从i + 3转到l[i]

l = ['Jason', 999999999, 'jason@live.com', 'Curt', 333333333, 'curt@job.com', "Jason", "foo", "bar"]

for i in range(len(l) - 1, -1, -1):
    if l[i] == "Jason":
        del l[i:i+3]

输出:

['Curt', 333333333, 'curt@job.com']

就你自己的代码而言,它假定"Jason"总是第一个元素,即使在删除任何以前看起来不太可能的东西之后,只有你肯定知道。

执行此操作的最有效方法是创建新列表或使用生成器函数更新原始列表:

def rem_jas(l):
    it = iter(l)
    for ele in it:
        if ele == "Jason":
            # skip two elements
            next(it,"")
            next(it, "")
        else:
            yield ele

输出:

In [30]: l = ['Jason', 999999999, 'jason@live.com', 'Curt', 333333333, 'curt@job.com', "Jason", "foo", "bar"]

In [31]: l[:] = rem_jas(l)

In [32]: l
Out[32]: ['Curt', 333333333, 'curt@job.com']

如果你可能在另一个Jason的两个元素中有Jason,那么你需要决定做什么是适当的。如果总有至少3个空格那么它就没事了。

根据您的编辑和事实,您有一个列表而不是平面列表,似乎您想要删除name出现的每个子列表,这会使代码变得更简单:

lst = [['Curt', 333333333, 'curt@job.com'], ['Jason', 999999999, 'jason@live.com']]
from itertools import chain
lst[:] = chain(*(sub for sub in lst if "Jason" not in sub))
print(lst)

输出:

['Curt', 333333333, 'curt@job.com']

sum不是压缩列表的好方法,itertools.chain效率更高。

如果你想保留这些子列表,那么就不要压扁:

 lst[:] = (sub for sub in lst if "Jason" not in sub)
 print(lst)

如果您有多个Jasons并且需要根据条件添加一些打印件,则为混合:

def rem_jas(l, name):
    it = iter(l)
    for ele in it:
        if ele == name:
            # skip two elements
            next(it,"")
            next(it, "")
        else:
            yield ele

def clean_lst(l):
    name = "Jason"
    for sub in l:
        tmp = list(rem_jas(sub, name))
        if tmp:
           yield tmp
        if len(tmp) == len(sub):
           print("{} not in sublist".format(name))


lst[:] = clean_lst(lst)
print(lst)

演示:

In [5]: lst = [['Curt', 333333333, 'curt@job.com'], ['Jason', 999999999, 'jason@live.com']]

In [6]: lst[:] = clean_lst(lst)
Jason not in sublist

In [7]: print(lst)
[['Curt', 333333333, 'curt@job.com']]

最后,如果您想让用户知道哪个子列表缺少名称:

def clean_lst(l):
    name = "Jason"
    for ind, sub in enumerate(l):
        tmp = list(rem_jas(sub, name))
        if tmp:
           yield tmp
        if len(tmp) == len(sub):
           print("{} not in sublist {}".format(name, ind))

答案 1 :(得分:1)

您只需搜索适当的索引,然后删除三个条目的切片:

lst = ['Jason', 999999999, 'jason@live.com', 'Curt', 333333333, 'curt@job.com']
if 'Jason' in lst:
    idx = lst.index('Jason')
    del lst[idx:idx+3]

结果:

>>> lst
['Curt', 333333333, 'curt@job.com']