Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何删除列表中的项目及其信息?_Python_Python 3.x - Fatal编程技术网

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-style
print()
,根据问题的标记,您使用的是Python 3。为什么您希望
raw\u input
工作?对不起,我是说
input
@Phyti-再说一遍,您使用的是Python 3<代码>原始输入在Python 3中不存在。