从 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)
为如下元素列表:
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)