比较列表项与另一个列表

时间:2017-07-26 12:14:37

标签: python-2.7

所以我想说我有3个项目清单:

myString = "prop zebra cool"
items = myString.split(" ")
#items = ["prop", "zebra", "cool"]

另一个列表 内容 ,其中包含大量字符串项。它实际上是一个文件列表。

现在我想只获取包含所有 项目 内容 的项目>

所以我开始这样:

assets = []
for c in content:
    for item in items:
        if item in c:
            assets.append(c)

然后以某种方式仅隔离 资产 列表中重复的项目

这样可以正常工作。但我不喜欢它,它不优雅。我确信在python

中还有其他一些方法可以解决这个问题

1 个答案:

答案 0 :(得分:0)

如果我正确解释您的问题,您可以使用https://www.scalescale.com/tips/nginx/configure-max_execution_time-in-php-fpm-using-nginx/#

在您的情况下,假设:

content = [
    "z:/prop/zebra/rig/cool_v001.ma",
    "sjasdjaskkk",
    "thisIsNoGood",
    "shakalaka",
    "z:/prop/zebra/rig/cool_v999.ma"
]
string = "prop zebra cool"

您可以执行以下操作:

assets = []
matchlist = string.split(' ')
for c in content:
    if all(s in c for s in matchlist):
        assets.append(c)
print assets

替代方法

如果你想拥有更多控制权(即你想确保你只匹配你的单词以指定顺序出现的字符串),那么你可以使用正则表达式:

import re

# convert content to a single, tab-separated, string
contentstring = '\t'.join(content)
# generate a regex string to match
matchlist = [r'(?:{0})[^\t]+'.format(s) for s in string.split(' ')]
matchstring = r'([^\t]+{0})'.format(''.join(matchlist))

assets = re.findall(matchstring, contentstring)
print assets

假设\t的字符串中没有显示content,您可以将其用作分隔符并将列表加入单个字符串中(显然,您可以选择更适合您的其他分隔符) )。

然后,您可以构建正则表达式,使其匹配包含您的单词和任何其他字符的任何子字符串,\t除外。

在这种情况下,matchstring会导致: ([^\t]+(?:prop)[^\t]+(?:zebra)[^\t]+(?:cool)[^\t]+) 其中:

  • (?:word)表示word已匹配但未返回
  • [^\t]+表示除\t之外的所有字符都匹配
  • ()将返回与您的规则匹配的整个字符串(在本例中为z:/prop/zebra/rig/cool_v001.maz:/prop/zebra/rig/cool_v999.ma