如果只给出部分匹配,如何从列表中删除

时间:2017-03-13 00:03:45

标签: list python-3.x dictionary

我有一种情况,我想从列表中删除项目。我只有列表项的一部分,所以典型的从列表中删除并不适合我,因为它不是完全匹配。

我想删除匹配的所有实例,而不仅仅是第一个匹配。

我确切知道列表项中有多少索引;但是我的搜索只包含6个索引项中的3个。

我使用的是Python 3.6

列表名称是DV

这是我到目前为止所做的尝试:

DECLARE @testdate date
SET @testdate = '4/15/17'

DECLARE @dayOfMonth int
SET @dayOfMonth = 31

SELECT CASE WHEN @dayOfMonth > DAY(@testdate) AND @dayOfMonth > DAY(EOMONTH(@testdate)) THEN EOMONTH(@testDate)
            WHEN @dayOfMonth > DAY(@testdate) AND @dayOfMonth <= DAY(EOMONTH(@testdate)) THEN DATEFROMPARTS(YEAR(@testDate),MONTH(@testDate),@dayOfMonth)
            WHEN @dayOfMonth <= DAY(@testdate) AND @dayOfMonth > DAY(DATEADD(MONTH,1,EOMONTH(@testdate))) THEN DATEADD(MONTH,1,EOMONTH(@testdate))
            WHEN @dayOfMonth <= DAY(@testdate) AND @dayOfMonth <= DAY(DATEADD(MONTH,1,EOMONTH(@testdate))) THEN DATEFROMPARTS(YEAR(DATEADD(MONTH,1,@testDate)),MONTH(DATEADD(MONTH,1,@testDate)),@dayOfMonth)
    END AS NextDisbursementDate

列表样本:

c = Brian,Eats,Dinner
if c in DV:
     DV.remove(str(Brian,Eats,Dinner))

这不起作用,因为我认为我没有完整的部分。

如果我用完整的值尝试它,它会从列表中删除它。问题是我只知道3个项目的价值。其他3个是不相关的。

提前致谢!

1 个答案:

答案 0 :(得分:1)

您可以创建一个新列表,其中仅包含与所有指定值不匹配的列表。

from collections import OrderedDict


data = [
    OrderedDict([('Category', 'Random'), ('Date Added', '03-03-2017'), ('Location', ''),
                 ('Name', 'Brian'), ('Activity', 'Eats'), ('Meal', 'Dinner')]),
    OrderedDict([('Category', 'Random'), ('Date Added', '03-03-2017'), ('Location', ''),
                 ('Name', 'Joe'), ('Activity', 'Runs'), ('Meal', 'Breakfast')]),
    OrderedDict([('Category', 'Random'), ('Date Added', '03-03-2017'), ('Location', ''),
                 ('Name', 'Brian'), ('Activity', 'Eats'), ('Meal', 'Dinner')]),
    OrderedDict([('Category', 'Random'), ('Date Added', '03-03-2017'), ('Location', ''),
                 ('Name', 'Brian'), ('Activity', 'Eats'), ('Meal', 'Dinner')])
]

# tuple of key, value pairs to check
key_values = ('Name', 'Brian'), ('Activity', 'Eats'), ('Meal', 'Dinner')
res = [d for d in data if not all(d.get(k) == v for k, v in key_values)]

如果您想要多组支票,那么您可以这样做。

key_values_lst = [
    (('Name', 'Brian'), ('Activity', 'Eats'), ('Meal', 'Dinner')),
    (('Name', 'Joe'), ('Activity', 'Eats'), ('Meal', 'Breakfast'))
]

res = [d for d in data if not any(all(d.get(k) == v for k, v in key_values)
                                  for key_values in key_values_lst)]

如果您总是使用相同的密钥并且想要在有很多组的情况下减少输入,也可以使用以下内容修剪列表。

keys = 'Name', 'Activity', 'Meal'
key_values_lst = [
    list(zip(keys, ('Brian', 'Eats', 'Dinner'))),
    list(zip(keys, ('Joe', 'Eats', 'Breakfast')))
]

输出

[OrderedDict([('Category', 'Random'),
              ('Date Added', '03-03-2017'),
              ('Location', ''),
              ('Name', 'Joe'),
              ('Activity', 'Runs'),
              ('Meal', 'Breakfast')])]