Python从数组中删除匹配模式的元素

时间:2017-05-16 21:02:39

标签: python arrays

我有一个字典,其中包含字符串作为键,列表作为值。

我想删除包含字符串“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))

3 个答案:

答案 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"})

此代码遍历当前密钥列表中的每个字符串,并根据无效字列表过滤掉所有无效字符串。