python - 如果元素存在于另一个列表中,则从列表中删除元素的问题
问题描述
我有一个类似这样的列表...
data = [['09/10/2018', '11/10/2018', 'Subject A', 'Teacher Name A', 'Assignment text...'], ['09/10/2018', '10/10/2018', 'Subject B', 'Teacher Name B', 'Assignment text...']]
我想从该列表中删除前三个元素位于 .csv 文件中的每个元素。
示例 CSV:
09/10/2018, 11/10/2018, Subject A
09/10/2018, 10/10/2018, Subject B
24/09/2018, 01/10/2018, Subject E
此 .csv 可能包含与数据列表中的任何列表都不匹配的行。
我的问题是我无法从基于 .csv 的数据列表中成功删除列表
以下是相关代码:
data = pull_data() # Gets the list of lists
with open('Log.csv') as f: #Opens Log.csv
prevData=[tuple(line) for line in csv.reader(f)] #Gets the data from the .csv
for sublist in data:
for prevSub in prevdata:
if(len(sublist) > 0 and len(prevSub) > 0):
if sublist[0] == prevSub[0]:
if sublist[1] == prevSub[1]:
if sublist[2] == prevSub[2]
data.pop(data.index(sublist)) # Should remove list from list of lists
解决方案
这是一种方法。这个想法是从 csv 文件构造一组元组。然后使用列表推导来过滤data
. 这确保了 O(1) 查找复杂度。元组转换是必要的,因为tuple
它是可散列的,而list
不是。
from io import StringIO
import csv
data = [['09/10/2018', '11/10/2018', 'Subject A', 'Teacher Name A', 'Assignment text...'],
['09/10/2018', '10/10/2018', 'Subject B', 'Teacher Name B', 'Assignment text...']]
x = StringIO(""" 09/10/2018, 11/10/2018, Subject A
09/10/2018, 10/10/2018, Subject B
24/09/2018, 01/10/2018, Subject E""")
# replace x with open('Log.csv')
with x as fin:
set_of_tuples = set(map(tuple, csv.reader(fin, skipinitialspace=True)))
# apply filter
res = [i for i in data if tuple(i[:3]) not in set_of_tuples]
推荐阅读
- r - 在R中将一列中的值分成两列
- android - 如何清除尚未为 Firebase Firestore 同步的本地写入队列?
- python - NameError ("name 'message' is not defined")
- html - Web 布局在检查器中粘贴和使用 vueJS 的文件中是不同的
- c++ - 尝试使用 OpenSSL evp aes 256 c++ 时出现链接错误
- r - 如何在r中计算到下一分钟的时间
- javascript - 为什么这么多 JS 库中使用 function(global, factory)?
- ios - dyld:库未加载:@rpath/Alamofire.framework/Alamofire 图像未找到
- android - 单击回收器适配器、Kotlin、Android Studio 中的单元格时显示进度条
- javascript - Firebase Storage Nodejs 如何在控制台中显示 url Public PDF Files