我有一种情况,我想从列表中删除项目。我只有列表项的一部分,所以典型的从列表中删除并不适合我,因为它不是完全匹配。
我想删除匹配的所有实例,而不仅仅是第一个匹配。
我确切知道列表项中有多少索引;但是我的搜索只包含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个是不相关的。
提前致谢!
答案 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')])]