Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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/1/list/4.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_List - Fatal编程技术网

Python 有没有一种简单的方法可以按值删除列表元素?

Python 有没有一种简单的方法可以按值删除列表元素?,python,list,Python,List,如果列表中存在值(可能不存在),我希望从列表中删除该值 上述情况(不存在)显示以下错误: 回溯(最近一次呼叫最后一次): 文件“D:\zjm_code\a.py”,第6行,在 b=a.指数(6) ValueError:列表。索引(x):x不在列表中 所以我必须这样做: a = [1, 2, 3, 4] try: b = a.index(6) del a[b] except: pass print(a) 但是没有更简单的方法可以做到这一点吗?要删除列表中元素的第一次

如果列表中存在值(可能不存在),我希望从列表中删除该值

上述情况(不存在)显示以下错误:

回溯(最近一次呼叫最后一次):
文件“D:\zjm_code\a.py”,第6行,在
b=a.指数(6)
ValueError:列表。索引(x):x不在列表中
所以我必须这样做:

a = [1, 2, 3, 4]

try:
    b = a.index(6)
    del a[b]
except:
    pass

print(a)

但是没有更简单的方法可以做到这一点吗?

要删除列表中元素的第一次出现,只需使用
列表。删除

>>> a = ['a', 'b', 'c', 'd']
>>> a.remove('b')
>>> print(a)
['a', 'c', 'd']
请注意,它不会删除元素的所有引用。使用列表来理解

>>> a = [10, 20, 30, 40, 20, 30, 40, 20, 70, 20]
>>> a = [x for x in a if x != 20]
>>> print(a)
[10, 30, 40, 30, 40, 70]
你能行

a=[1,2,3,4]
if 6 in a:
    a.remove(6)
但上面需要在列表a中搜索2次6,所以尝试“除外”会更快

try:
    a.remove(6)
except:
    pass

在列表中查找一个值,然后删除该索引(如果存在),只需使用列表的remove方法即可轻松完成:

>>> a = [1, 2, 3, 4]
>>> try:
...   a.remove(6)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 3, 4]
>>> try:
...   a.remove(3)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 4]
如果您经常这样做,可以将其封装在函数中:

def remove_if_exists(L, value):
  try:
    L.remove(value)
  except ValueError:
    pass

通常,如果您让Python执行它无法执行的操作,Python会抛出异常,因此您必须执行以下任一操作:

if c in a:
    a.remove(c)
或:


例外情况并不一定是坏事,只要它是您期望的并正确处理的例外情况。

以下是如何就地处理(无需列表理解):


如果您知道要删除哪些值,那么这里有一个简单的方法(无论如何,这是我能想到的最简单的方法):

你会得到
[0,0,2,3,4]
考虑:

a = [1,2,2,3,4,5]
要删除所有出现的内容,可以使用python中的filter函数。 例如,它看起来像:

a = list(filter(lambda x: x!= 2, a))
因此,它将保留
a!=2

要仅取出其中一个项目,请使用

a.remove(2)

此示例非常快速,将从列表中删除某个值的所有实例:

a = [1,2,3,1,2,3,4]
while True:
    try:
        a.remove(3)
    except:
        break
print a
>>> [1, 2, 1, 2, 4]

另一种可能是使用集合而不是列表,前提是集合适用于您的应用程序

即如果您的数据未排序,并且没有重复项,则

my_set=set([3,4,2])
my_set.discard(1)
是无错误的

通常情况下,列表只是一个方便的容器,用于存放实际上未排序的项目。有一些问题询问如何从列表中删除元素的所有出现。如果你一开始不想被复制,那么一套也很方便

my_set.add(3)

不更改上面的my_集合。

如果元素不同,则简单的集合差异即可

c = [1,2,3,4,'x',8,6,7,'x',9,'x']
z = list(set(c) - set(['x']))
print z
[1, 2, 3, 4, 6, 7, 8, 9]
我们也可以使用。pop:

>>> lst = [23,34,54,45]
>>> remove_element = 23
>>> if remove_element in lst:
...     lst.pop(lst.index(remove_element))
... 
23
>>> lst
[34, 54, 45]
>>> 

通过索引除要删除的元素外的所有内容来覆盖列表

>>> s = [5,4,3,2,1]
>>> s[0:2] + s[3:]
[5, 4, 2, 1]
更一般地说

>>> s = [5,4,3,2,1]
>>> i = s.index(3)
>>> s[:i] + s[i+1:]
[5, 4, 2, 1]

使用for循环和条件:

def cleaner(seq, value):    
    temp = []                      
    for number in seq:
        if number != value:
            temp.append(number)
    return temp
如果您想删除一些,但不是全部:

def cleaner(seq, value, occ):
    temp = []
    for number in seq:
        if number == value and occ:
            occ -= 1
            continue
        else:
            temp.append(number)
    return temp

例如,我们想从x中删除所有1。我会这样做:

x = [1, 2, 3, 1, 2, 3]
现在,这是我的方法的一个实际应用:

def Function(List, Unwanted):
    [List.remove(Unwanted) for Item in range(List.count(Unwanted))]
    return List
x = Function(x, 1)
print(x)
这是我在一行中的方法:

[x.remove(1) for Item in range(x.count(1))]
print(x)
两者都将此作为输出:

[2, 3, 2, 3, 2, 3]
希望这有帮助。
另外,请注意,这是在3.6.2版中编写的,因此您可能需要针对较旧的版本进行调整。

正如许多其他答案所述,
list.remove()
将起作用,但如果该项不在列表中,则抛出一个
ValueError
。对于python 3.4+,有一种有趣的处理方法,使用:


这将从数组
sys.argv
中删除
“-v”
的所有实例,如果未找到实例,则不会抱怨:

while "-v" in sys.argv:
    sys.argv.remove('-v')
您可以在名为
speechToText.py的文件中看到正在运行的代码:

$ python speechToText.py -v
['speechToText.py']

$ python speechToText.py -x
['speechToText.py', '-x']

$ python speechToText.py -v -v
['speechToText.py']

$ python speechToText.py -v -v -x
['speechToText.py', '-x']

也许你的解决方案适用于ints,但它不适用于我的字典

一方面,remove()对我不起作用。但它可能适用于基本类型。我猜下面的代码也是从对象列表中删除项的方法

另一方面,“del”也没有正常工作。在我的例子中,使用Python3.6:当我尝试使用'del'命令从'for'bucle中的列表中删除一个元素时,python会在这个过程中更改索引,而bucle会提前停止。仅当您按相反的顺序逐个删除元素时,此选项才有效。通过这种方式,在处理挂起元素数组索引时,不会更改它

然后,我用:

c = len(list)-1
for element in (reversed(list)):
    if condition(element):
        del list[c]
    c -= 1
print(list)
其中“list”类似于[{'key1':value1'}、{'key2':value2}、{'key3':value3}、]

此外,您还可以使用enumerate执行更多Python操作:

for i, element in enumerate(reversed(list)):
    if condition(element):
        del list[(i+1)*-1]
print(list)
一行:

a.remove('b') if 'b' in a else None
有时它是有用的

更简单的是:

if 'b' in a: a.remove('b')

这是我的答案,只需使用whilefor

def remove_all(data, value):
    i = j = 0
    while j < len(data):
        if data[j] == value:
            j += 1
            continue
        data[i] = data[j]
        i += 1
        j += 1
    for x in range(j - i):
        data.pop()
def remove_all(数据、值):
i=j=0
而j
许多答案都涉及创建新列表。这涉及到将旧列表中的所有数据复制到新列表中(删除的项目除外)。如果你的单子很大,你可能负担不起(或者你不想)

在这些情况下,更改列表的速度要快得多。如果必须从列表中删除多个元素,则可能会很棘手。假设您在列表上循环,并删除一个项目,那么列表将更改,循环的标准将不考虑这一点。循环的结果可能不是您期望的结果

例如:

a = [0, 1, 2, 3, 4, 5]
for i in a:
    a.remove(i)  # Remove all items
print(a)

Out: [1, 3, 5]
一个简单的解决方案是以相反的顺序遍历列表。在这种情况下,您会得到:

a = [0, 1, 2, 3, 4, 5]
for i in reversed(a):
    a.remove(i)  # Remove all items
print(a)

Out: []
然后,如果只需要删除具有某些特定值的元素,只需在循环中放入
if语句
,即可得到:

a = [0, 1, 2, 3, 4, 5]
for i in reversed(a):
    if i == 2 or i == 3:  # Remove all items having value 2 or 3.
        a.remove(i)
print(a)

Out: [0, 1, 4, 5]

一些最简单方法的基准:

随机导入
从副本导入副本
样本=随机样本(范围(100000),10000)
移除=随机样本(范围(100000),1000)
%%时间
样本1=副本(样本)
remove1=复制(删除)
对于反向中的i(样本1):
如果我在remove1中:
样本1.移除(i)
#每个回路271 ms±16 ms(7次运行的平均值±标准偏差,每个回路1次)
#删除所有实例
%%时间
样本1=副本(样本)
remove1=复制(删除)
过滤=列表(过滤器(λx:x不在移除1中,样本1))
#每个回路280 ms±18.9 ms(7次运行的平均值±标准偏差,每个回路1次)
#雷莫
for i, element in enumerate(reversed(list)):
    if condition(element):
        del list[(i+1)*-1]
print(list)
a.remove('b') if 'b' in a else None
if 'b' in a: a.remove('b')
def remove_all(data, value):
    i = j = 0
    while j < len(data):
        if data[j] == value:
            j += 1
            continue
        data[i] = data[j]
        i += 1
        j += 1
    for x in range(j - i):
        data.pop()
a = [0, 1, 2, 3, 4, 5]
for i in a:
    a.remove(i)  # Remove all items
print(a)

Out: [1, 3, 5]
a = [0, 1, 2, 3, 4, 5]
for i in reversed(a):
    a.remove(i)  # Remove all items
print(a)

Out: []
a = [0, 1, 2, 3, 4, 5]
for i in reversed(a):
    if i == 2 or i == 3:  # Remove all items having value 2 or 3.
        a.remove(i)
print(a)

Out: [0, 1, 4, 5]