我有以下列表:
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']]`
答案 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']