Python 如何删除列表中的项目及其信息?
我有以下清单:Python 如何删除列表中的项目及其信息?,python,python-3.x,Python,Python 3.x,我有以下清单: lst= ['Jason', 999999999, 'jason@live.com', 'Curt', 333333333, 'curt@job.com'] 我想删除Jason和接下来的2个条目以及以下内容,所以我想: for i in range(len(lst)): if "Jason" in lst: del lst[0] del lst[1] del lst[2] else: prin
lst= ['Jason', 999999999, 'jason@live.com', 'Curt', 333333333, 'curt@job.com']
我想删除Jason和接下来的2个条目以及以下内容,所以我想:
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']]`
您只需搜索适当的索引,然后删除由三个条目组成的切片:
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']
如果可以有多个,请从列表末尾开始,如果
l[i]
等于以下值,则将i
删除到i+3
:
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']
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']
['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
输出:
['Curt', 333333333, 'curt@job.com']
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']
['Curt', 333333333, 'curt@job.com']
如果您可能在另一个Jason
的两个元素中包含Jason
,那么您需要决定应该做什么。如果总是至少有3个空格,那么就可以了
根据您的编辑以及您有一个列表列表而不是平面列表的事实,您似乎希望删除出现名称的每个子列表,这使代码变得更简单:
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']
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']
['Curt', 333333333, 'curt@job.com']
sum
不是将列表展平的好方法,itertools.chain
效率更高
如果要保留子列表,请不要展平:
lst[:] = (sub for sub in lst if "Jason" not in sub)
print(lst)
或者,如果您有多个Jason并且需要根据条件添加一些打印,则可以选择混合打印:
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)
演示:
最后,如果要让用户知道哪个子列表缺少名称:
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))
为什么有人投了两次反对票?用户已经给出了代码并展示了他/她所做的事情。这不公平。如果你认为这是一个简单的问题,那么帮助回答它,而不是否决它。只是一个试探性的建议,接受与否取决于你想做什么。字典似乎是您数据的更好选择,例如dic={'Jason':{'phone':99999,'mail':'jason@live.com“},'Curt':…}
,然后如果dic:del dic['Jason']中的'Jason'是
。这正是我的观点…这个向下投票的事情必须停止..好吧,我被向下投票了两次,我被迫删除了我的答案,尽管我已经测试了我的答案,并且成功了…这变得荒谬和不成熟…我在这里的javascript社区中甚至没有遇到太多这些问题..嗯..不友好的环境蟒蛇……希望如此improves@SyrtisMajor我接受你的建议,但我真的很想将其保留在列表中,因为我不想使代码过于复杂。似乎有人在圣诞节不高兴。@BMW,我想有一块煤上面有人的名字;)@KevinGuan,我的答案的脚注讨论到,如果Jason可以出现在两个地方,这只是一个问题,从OP的描述和自己的逻辑来看,我怀疑这是可能的,使用生成器逻辑比创建多个新列表和进行多个查找要有效得多。在某些情况下,您可以根据特定的条件完全清空列表criteria@Phyti,准确地将输入内容和输出内容添加到问题中。如果你想要一个列表,那就不要flatten@Phyti,子列表可以有多长时间?名称可以多次出现?您可以指定它不起作用的方式吗?使用raw_input
的代码当然有很多失败的方法,但也有很多成功的方法。我更新了帖子,让您了解代码结构。@Phyti-您使用的是Python 3-styleprint()
,根据问题的标记,您使用的是Python 3。为什么您希望raw\u input
工作?对不起,我是说input
@Phyti-再说一遍,您使用的是Python 3<代码>原始输入在Python 3中不存在。