Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.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 - Fatal编程技术网

Python 在列表之间匹配字符串并删除所述字符串

Python 在列表之间匹配字符串并删除所述字符串,python,Python,我这里有一些清单。一个永远不会更改的默认列表,一个作为此代码更改目标的临时列表,以及两个其他列表 我需要检查list2和list3(一次一个)的字符串内容,然后从list1temp中删除匹配的字符串。List1用于将原始字符串恢复到list1temp 老实说,我是一个新手,我知道如何处理这个问题,但我甚至不知道如何尝试 我假设我需要一个for循环,然后使用pop和append方法 list1 = ["a", "b", "c", "d"] list1temp = ["a", "b", "c," "

我这里有一些清单。一个永远不会更改的默认列表,一个作为此代码更改目标的临时列表,以及两个其他列表

我需要检查list2和list3(一次一个)的字符串内容,然后从list1temp中删除匹配的字符串。List1用于将原始字符串恢复到list1temp

老实说,我是一个新手,我知道如何处理这个问题,但我甚至不知道如何尝试

我假设我需要一个for循环,然后使用pop和append方法

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,我同意这是不一样的。谢谢你解释这一切。我必须承认,它有点先进,我不太懂。但我一定会继续努力,并牢记这一切。那好吗