在许多列表中删除列表的唯一项

时间:2018-08-27 14:23:22

标签: python list loops

我有这些列表是正确的,需要纠正的情况在问题末尾的解释部分中。

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']

4 个答案:

答案 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)。

注意:仅当问题本身显示两个列表时,该选项才起作用。