我有一个字典,其中包含字符串作为键,列表作为值。
我想删除包含字符串“food”,“staging”,“msatl”和“azeus”的所有列表元素。我已经有了下面的代码,但是我很难将filterIP中的逻辑应用到我拥有的其余字符串中。
<div>
当前输出示例
def filterIP(fullList):
regexIP = re.compile(r'\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$')
return filter(lambda i: not regexIP.search(i), fullList)
groups = {key : [domain.replace('fake.com', 'env.fake.com')
for domain in filterIP(list(set(items)))]
for (key, items) in groups.iteritems() }
for key, value in groups.iteritems():
value.sort()
meta = { "_meta" : { "hostvars" : hostvars } }
groups.update(meta)
print(self.json_format_dict(groups, pretty=True))
答案 0 :(得分:3)
列表理解是你之后的
x= ["a", "b", "aa", "aba"]
x_filtered = [i for i in x if "a" not in i]
print(x_filtered)
>>> ['b']
这只是for循环的简写。
x_filtered = []
for i in x:
if "a" not in i:
x_filtered.append(i)
答案 1 :(得分:1)
如果我理解正确,这可能会有所帮助。
设置排除列表:
exclude= ["food", "staging", "msatl", "azeus"]
测试列表(我无法在您的示例中找到实例)
test= ["food", "staging", "msatl", "azeus", "a", "bstaging"]
运行列表理解(迭代器的名称无关紧要,你可以选择更合适的名称)
result= [i for i in test if not any([e for e in exclude if e in i])]
结果 [ '一']
@Julian的上述答案很好地解释了列表推导的作用。如果 exclude 列表中存在任何匹配项,则会使用其中两个,any
部分为True
。
希望这会有所帮助。
答案 2 :(得分:1)
完成任务的一种简单方法是迭代字典中的每个列表。根据您的条件创建新列表,并将新列表分配给相同的键但在新词典中。这是代码中的样子:
else
你会这样称呼它:
def filter_words(groups, words):
d = {}
for key, domains in groups.iteritems():
new_domains = []
for domain in domains:
if not any(word in domain for word in words):
new_domains.append(domain)
d[key] = new_domains
return d
上面代码的“肉”是循环的第二个:
groups = filter_words(groups, {"food", "staging", "msatl" and "azeus"})
此代码遍历当前密钥列表中的每个字符串,并根据无效字列表过滤掉所有无效字符串。