从 python 中的文件中排除列表中的元素

Exclude elements from a list from a file in python

为如下元素列表:

listELEMENTS = ['aaa', 'bbb', 'ccc']

并成为以下 txt 文件 (elements.txt),其中包含应保留在列表中的元素列表:

elements.txt
aaa
ccc
ddd

思路是将listELEMENTS中不在元素elements.txt文件中的元素删除,所以删除后的最终结果是这样的:

listELEMENTS = ['aaa', 'ccc']

我做的代码是这样的,但它消除了所有元素。有谁知道错误在哪里?

with open("elements.txt") as f:
    for line in f:
       (key) = line.split()
           for i in listELEMENTS :
               if i not in key:
                   listELEMENTS.remove(i)

您好,您可以使用 intersection:

a =  ['aaa', 'bbb', 'ccc'] 

b =  ['aaa', 'ccc', 'ddd']


list(set(a).intersection(b))
['ccc', 'aaa']

所以你可以这样做:

listELEMENTS = ['aaa', 'bbb', 'ccc'] 

with open("elements.txt") as f: 
    file_elements = f.read().splitlines() 
    #print(file_elements) 
    listELEMENTS =list(set(listELEMENTS).intersection(file_elements)) 
print(listELEMENTS)                                                   

['ccc', 'aaa']

您的代码中的问题是您正在检查 listELEMENTS 的每个元素是否存在于文件的 特定元素 而不是所有文件元素中( if i not in key).

将您的代码更改为:

listELEMENTS = ['aaa', 'bbb', 'ccc']

with open("elements.txt") as f:
    file_elements = f.read().splitlines() # read all elements of the file into a list
    for i in listELEMENTS:
        if i not in file_elements:
        # check that i not exists in the full list of elements 
            listELEMENTS.remove(i)
print(listELEMENTS) # ['aaa', 'ccc']

或者,您可以使用列表理解以更短的方式完成此操作:

with open("elements.txt") as f:
    file_elements = f.read().splitlines()
    listELEMENTS = [i for i in listELEMENTS if i in file_elements]
print(listELEMENTS) # ['aaa', 'ccc']

您正在对您的代码进行两次迭代,一次针对文件中的每一行,另一次针对列表中的每个元素进行一次,因此,获取您的示例我们将拥有:

  • 迭代 01:
    list_elements = ['aaa', 'bbb', 'ccc']
    line = 'aaa'
    key = ['aaa']

    Inside this iteration another one is going to happen, so:

    - Iteration 01:
        i = 'aaa'
        i is in key, no element removed.

    - Iteration 02:
        i = 'bbb'
        i is NOT in key, 'bbb' gets removed.
        Finished iteration because an element was removed from the list
  • 迭代 02
    list_elements = ['aaa', 'ccc']
    line = 'ccc'
    key = ['ccc']

    Inside this iteration another one is going to happen, so:

    - Iteration 01:
        i = 'aaa'
        i is NOT in key, 'aaa' gets removed INCORRECTLY.
        Iterator finished.

我建议您更改从列表中删除数据的方式,而不是编辑您正在迭代的列表,而是使用您实际将要使用的数据创建一个新列表:

listELEMENTS = ['aaa', 'bbb', 'ccc']
used_elements = []
with open("elements.txt") as f:
    file_content = f.read().splitlines()
    for i in listELEMENTS:
        if i in file_content:
            used_elements.append(i)

print(used_elements)