按字符串中的文本过滤字典列表

时间:2018-02-09 15:48:36

标签: python django python-3.x dictionary

我有一个字典列表,需要按字符串列表过滤它们。

现在我有这个:

function countdown(duration) {
  const start = Date.now();
  const interval = window.setInterval(function() {
     const remaining = duration - (Date.now() - start);
     if (remaining <= 0) {
        console.log(0);
        window.clearInterval(interval);
        return;
     }
     console.log(remaining);
  }, 500);
}

countdown(5000);

我需要的结果是:

projects = [{u'CustomerName': u'abc', u'Projectname': u'Contract A full'},
{u'CustomerName': u'bcd', u'Projectname': u'Contract A medium'},
{u'CustomerName': u'cde', u'Projectname': u'Contract B full'},
{u'CustomerName': u'def', u'Projectname': u'Contract B medium'}]

filter = ['B', 'full']

return [p for p in projects if p['ProjectName'] in filter]

然而它什么也没有回报。只有我指定整个字符串:

[{u'CustomerName': u'abc', u'Projectname': u'Contract A full'},
{u'CustomerName': u'cde', u'Projectname': u'Contract B medium'},
{u'CustomerName': u'cde', u'Projectname': u'Contract B full'}]

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

这是一种方法,假设您正在寻找包含&#39; full&#39;的项目名称:

[p for p in projects if 'full' in p['ProjectName']]

或者如果您需要包含&#39; B&#39;或者&#39;完整&#39;:

[p for p in projects if any(i in p['ProjectName'] for i in ('B', 'full'))]

答案 1 :(得分:1)

明确的答案是非常优雅的出路,特别是对于“任何”部分。

以下是使用正则表达式的另一种方法:

import re
[p for p in projects if re.match(".*(B|full).*",p["Projectname"])]

“。*”基本上意味着任何事件发生,这个正则表达式意味着你正在寻找“B”或“完整”的出现,前面和后面有任何东西。

虽然你可能会遇到一些与意外事物相匹配的情况,例如“合约更充分的媒介”或其他一些事情,但正则表达式确实适用于你所呈现的简单案例而不会有太多麻烦。