Python 在列表之间匹配字符串并删除所述字符串
我这里有一些清单。一个永远不会更改的默认列表,一个作为此代码更改目标的临时列表,以及两个其他列表 我需要检查list2和list3(一次一个)的字符串内容,然后从list1temp中删除匹配的字符串。List1用于将原始字符串恢复到list1temp 老实说,我是一个新手,我知道如何处理这个问题,但我甚至不知道如何尝试 我假设我需要一个for循环,然后使用pop和append方法Python 在列表之间匹配字符串并删除所述字符串,python,Python,我这里有一些清单。一个永远不会更改的默认列表,一个作为此代码更改目标的临时列表,以及两个其他列表 我需要检查list2和list3(一次一个)的字符串内容,然后从list1temp中删除匹配的字符串。List1用于将原始字符串恢复到list1temp 老实说,我是一个新手,我知道如何处理这个问题,但我甚至不知道如何尝试 我假设我需要一个for循环,然后使用pop和append方法 list1 = ["a", "b", "c", "d"] list1temp = ["a", "b", "c," "
list1 = ["a", "b", "c", "d"]
list1temp = ["a", "b", "c," "d"]
list2 = ["b", "c"]
list3 = ["a"] #<- this is still a list even though it has just one element because in the future it could be given more elements
list1=[“a”、“b”、“c”、“d”]
list1temp=[“a”、“b”、“c”、“d”]
清单2=[“b”,“c”]
list3=[“a”]#列表理解允许您同时复制其他列表
如果元素s
不在list2
中,则不在列表2中的s将返回true
[s for s in list1 if condition]
将创建一个新列表,其中包含与条件匹配的list1
元素,在本例中,条件不在list2
或list3
中
list1=[“a”、“b”、“c”、“d”]
清单2=[“b”,“c”]
清单3=[“a”]
list1temp=[s表示列表1中的s,如果s不在列表2中]
打印(列表1temp)
list1temp=[s表示列表1中的s,如果s不在列表3中]
打印(列表1temp)
您还可以在python中使用set操作(并将结果转换回list):
蛮力方法是遍历list2
和list3
中的每个项目,检查该项目是否在list1temp
中,如果是这样,则将其从list1temp
中删除
例如:
for val in list2:
if val in list1temp:
list1temp.remove(val)
for val in list3:
if val in list1temp:
list1temp.remove(val)
for val in list1temp:
while val in list2 or val in list3:
list1temp.remove(val)
def list_remover(list1temp, list2, list3):
2 #This runs in O(n*log(n))
3 list1temp.sort()
4 list2.sort()
5 list3.sort()
6
7 #This runs in O(n)
8 idx1 = 0
9 idx2 = 0
10 idx3 = 0
11
12 if len(list2) == 0:
13 list2 = [list1temp[0] - 1]
14 if len(list3) == 0:
15 list3 = [list1temp[0] - 1]
16
17 while idx1 < len(list1temp):
18 if list1temp[idx1] == list2[idx2]:
19 list1temp.remove(list2[idx2])
20 elif list1temp[idx1] == list3[idx3]:
21 list1temp.remove(list3[idx3])
22 elif list1temp[idx1] > list2[idx2] and idx2 < len(list2) - 1:
23 idx2 += 1
24 elif list1temp[idx1] > list3[idx3] and idx3 < len(list3) - 1:
25 idx3 += 1
26 else:
27 idx1 += 1
28 return list1temp
您还可以更改上面循环的顺序:迭代list1temp
的元素,然后检查list2和list3中的项目是否存在并删除它们:
for val in list1temp:
if val in list2 or val in list3:
list1temp.remove(val)
注意:上述方法不考虑list1temp中的重复值。为了处理这种情况,您可以不断重试“列表中是否有此项”的检查,直到其为false
例如:
for val in list2:
if val in list1temp:
list1temp.remove(val)
for val in list3:
if val in list1temp:
list1temp.remove(val)
for val in list1temp:
while val in list2 or val in list3:
list1temp.remove(val)
def list_remover(list1temp, list2, list3):
2 #This runs in O(n*log(n))
3 list1temp.sort()
4 list2.sort()
5 list3.sort()
6
7 #This runs in O(n)
8 idx1 = 0
9 idx2 = 0
10 idx3 = 0
11
12 if len(list2) == 0:
13 list2 = [list1temp[0] - 1]
14 if len(list3) == 0:
15 list3 = [list1temp[0] - 1]
16
17 while idx1 < len(list1temp):
18 if list1temp[idx1] == list2[idx2]:
19 list1temp.remove(list2[idx2])
20 elif list1temp[idx1] == list3[idx3]:
21 list1temp.remove(list3[idx3])
22 elif list1temp[idx1] > list2[idx2] and idx2 < len(list2) - 1:
23 idx2 += 1
24 elif list1temp[idx1] > list3[idx3] and idx3 < len(list3) - 1:
25 idx3 += 1
26 else:
27 idx1 += 1
28 return list1temp
上述方法并不十分有效。时间复杂度为O(m*n),其中m是list1temp
的长度,n是list2
和list3
的长度之和。(在列表对象上,
中的运算符是O(n)
对于较大的列表,更好的解决方案是对每个列表进行排序(可以在O(n*log(n))中完成),然后对列表进行一次遍历以检查匹配值
例如:
for val in list2:
if val in list1temp:
list1temp.remove(val)
for val in list3:
if val in list1temp:
list1temp.remove(val)
for val in list1temp:
while val in list2 or val in list3:
list1temp.remove(val)
def list_remover(list1temp, list2, list3):
2 #This runs in O(n*log(n))
3 list1temp.sort()
4 list2.sort()
5 list3.sort()
6
7 #This runs in O(n)
8 idx1 = 0
9 idx2 = 0
10 idx3 = 0
11
12 if len(list2) == 0:
13 list2 = [list1temp[0] - 1]
14 if len(list3) == 0:
15 list3 = [list1temp[0] - 1]
16
17 while idx1 < len(list1temp):
18 if list1temp[idx1] == list2[idx2]:
19 list1temp.remove(list2[idx2])
20 elif list1temp[idx1] == list3[idx3]:
21 list1temp.remove(list3[idx3])
22 elif list1temp[idx1] > list2[idx2] and idx2 < len(list2) - 1:
23 idx2 += 1
24 elif list1temp[idx1] > list3[idx3] and idx3 < len(list3) - 1:
25 idx3 += 1
26 else:
27 idx1 += 1
28 return list1temp
def列表\u移除器(列表1、列表2、列表3):
2#这在O(n*log(n))中运行
3 list1temp.sort()
4列表2.sort()
5列表3.sort()
6.
7#这在O(n)中运行
8 idx1=0
9 idx2=0
10 idx3=0
11
12如果len(列表2)=0:
13 list2=[list1temp[0]-1]
14如果len(列表3)=0:
15 list3=[list1temp[0]-1]
16
17当idx1list2[idx2]和idx2list3[idx3]和idx3
上面的代码还处理重复的代码
有关时间复杂性的更多信息,请阅读此处:首先,这些都不是列表list1
、list1temp
和list2
是元组,它们类似于列表,但不可变,也就是说,它们不能更改<代码>列表3是一个字符串。在元素周围添加[
和]
,使其成为列表。不确定我是否正确理解您的意思。然后从列表1temp中删除匹配的字符串,这意味着list2
和list3
最终将为空,因为list1temp
包含所有的字母。那么您的预期输出是什么?@Erfan我认为他的意思是从列表1temp中删除list2和list3中的元素,输出[“d”]
@adrio啊,好的。这是我的第一个错误。非常感谢。我会纠正的。或者只是检查它是否不在两个列表中组合list1temp=[s代表list1中的s,如果s不在list2+list3]
,这也是有效的,但我必须解释,添加两个列表会创建一个新的列表,其中的元素连接在一起。如果我们想这样做,可能制作list2
和list3
集也是一个好主意。实际上,我想说的是,只要使用一个集合就行了,因为它只是有意义的。他的注释指向现在分开做过滤器,这样就更容易了。当然,你会失去集合的顺序无序的。他似乎需要每个过滤器本身,而不是同时使用两个过滤器time@Adirio在这里,一个接一个地过滤也可以通过在单独的行上一个接一个地进行减法来完成。如果把事情安排给OP,我同意这是不一样的。谢谢你解释这一切。我必须承认,它有点先进,我不太懂。但我一定会继续努力,并牢记这一切。那好吗