我有这些列表是正确的,需要纠正的情况在问题末尾的解释部分中。
ps
['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']
和
db
['C:\\Users\\user\\Desktop\\sa\\43001\\DBOUND\\DBOUND.shp',
'C:\\Users\\user\\Desktop\\sa\\43003\\DBOUND\\DBOUND.shp']
我想比较这些列表,如果其中一个列表项的唯一性是指数字为300001的[-3]位置是唯一的,则应删除该列表。最后,只应保留编号相同的项目对。
我该怎么做?
我的代码:
for i,v in list(zip(ps,db)):
if i.split("\\")[-3] not in v.split("\\")[-3]:
ps.remove(i)
说明
如果列表是这样的:
ps
['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']
和
db
['C:\\Users\\user\\Desktop\\sa\\43001\\DBOUND\\DBOUND.shp',
'C:\\Users\\user\\Desktop\\sa\\43003\\DBOUND\\DBOUND.shp',
'C:\\Users\\user\\Desktop\\sa\\43009\\DBOUND\\DBOUND.shp']
具有43009的项目应被删除,因为它在ps
列表中不存在,最终列表将如下所示:
ps
['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']
和
db
['C:\\Users\\user\\Desktop\\sa\\43001\\DBOUND\\DBOUND.shp',
'C:\\Users\\user\\Desktop\\sa\\43003\\DBOUND\\DBOUND.shp']
答案 0 :(得分:1)
ps = ['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']
db = ['C:\\Users\\user\\Desktop\\sa\\43001\\DBOUND\\DBOUND.shp',
'C:\\Users\\user\\Desktop\\sa\\43003\\DBOUND\\DBOUND.shp',
'C:\\Users\\user\\Desktop\\sa\\43009\\DBOUND\\DBOUND.shp']
filtered_db = [i for i in db if i.split('\\')[-3] in {j.split('\\')[-3] for j in ps}]
print(filtered_db)
# ['C:\\Users\\user\\Desktop\\sa\\43001\\DBOUND\\DBOUND.shp',
# 'C:\\Users\\user\\Desktop\\sa\\43003\\DBOUND\\DBOUND.shp']
filtered_ps = [i for i in ps if i.split('\\')[-3] in {j.split('\\')[-3] for j in db}]
print(filtered_ps)
# ['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
# 'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']
答案 1 :(得分:1)
您可以创建一组唯一的ID。然后使用该设置检查包含唯一ID的路径,并相应地将其删除。像这样:
class Report(models.Model)
id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
uuid = models.UUIDField(default=uuid.uuid4, editable=False, serialize=False, verbose_name='UUID')
data = models.DateTimeField(auto_now_add=True, verbose_name='Date')
...
希望这会有所帮助!
答案 2 :(得分:0)
您可以使用来自ps
的已解析密钥创建一个临时列表,然后根据密钥创建过滤的db
...
parse_key = lambda s: s.split('\\')[-3]
ps = ['C:\\Users\\user\\Desktop\\sa\\43001\\PST\\PST.shp',
'C:\\Users\\user\\Desktop\\sa\\43003\\PST\\PST.shp']
ps_key = [parse_key(s) for s in ps]
print (ps_key) # ['43001', '43003']
db = ['C:\\Users\\user\\Desktop\\sa\\43001\\DBOUND\\DBOUND.shp',
'C:\\Users\\user\\Desktop\\sa\\43003\\DBOUND\\DBOUND.shp',
'C:\\Users\\user\\Desktop\\sa\\43009\\DBOUND\\DBOUND.shp']
db_key = [parse_key(s) for s in db]
print (db_key) # ['43001', '43003', '43009']
db_new = [s for s in db if parse_key(s) in ps_key]
print (db_new)
答案 3 :(得分:0)
new_list = [i for i in max(lists, key=len) if i.split('\\')[-3] in {j.split('\\')[-3] for j in min(lists, key=len)}]
这将扩大列表的大小,而不管它是哪一个,并且最后两个元素最终将具有相同数量的元素(具有相同的ID)。
注意:仅当问题本身显示两个列表时,该选项才起作用。