Python:将列表与字符串进行比较

时间:2014-12-31 05:50:25

标签: python string list comparison overlapping

我想知道如何将字符串与列表进行比较。 例如 我有字符串' abcdab'和一个清单['ab','bcd','da']。有没有办法将所有可能的列表组合与字符串进行比较,并避免重叠元素。所以输出将是一个像元组的列表 [('ab','da'),('bcd'),('bcd','ab'),('ab','ab'),('ab'),('da')].

输出应避免使用('bcd', 'da')之类的组合作为字符' d'在元组中重复,而在字符串中只出现一次。

正如答案所指出的那样。字符串和列表元素中的字符不得重新排列。

我尝试过的一种方法是将字符串元素拆分为所有可能的组合并进行比较。其中2 ^(n-1)n是字符数。这非常耗时。

我是python编程的新手。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

  

所有可能的列表组合到字符串,并避免重叠   元素

组合中一个或多个完整项目的精确当前顺序是否与字符串的模式或子模式匹配?我认为其中一个要求是不重新排列列表中的项目(ab不会替代ba)。我相信其中一个要求是不重新排列字符串中的字符。如果子模式出现两次,那么您希望组合自身反映子模式的两个单独副本,以及子模式的两个项目列表以及其他子模式也匹配。你想要匹配的多个排列。

答案 1 :(得分:0)

这个小递归函数应该可以完成这项任务:

def matches(string, words, start=-1):
    result= []
    for word in words: # for each word
        pos= start
        while True:
            pos= string.find(word, pos+1) # find the next occurence of the word
            if pos==-1: # if there are no more occurences, continue with the next word
                break

            if [word] not in result: # add the word to the result
                result.append([word])

            # recursively scan the rest of the string
            for match in matches(string, words, pos+len(word)-1):
                match= [word]+match
                if match not in result:
                    result.append(match)
    return result

输出:

>>> print matches('abcdab', ['ab','bcd','da'])
[['ab'], ['ab', 'ab'], ['ab', 'da'], ['bcd'], ['bcd', 'ab'], ['da']]

答案 2 :(得分:0)

糟糕!我不知何故错过了罗宁的回答。那好吧。 :)

这是另一种递归解决方案。

#! /usr/bin/env python

def find_matches(template, target, output, matches=None):
    if matches is None:
        matches = []

    for s in template:
        newmatches = matches[:]
        if s in target:
            newmatches.append(s)
            #Replace matched string with a null byte so it can't get re-matched
            # and recurse to find more matches.
            find_matches(template, target.replace(s, '\0', 1), output, newmatches)
        else:
            #No (more) matches found; save current matches
            if newmatches:
                output.append(tuple(newmatches))
            return


def main():
    target = 'abcdab'
    template = ['ab','bcd','da']

    print template
    print target

    output = []
    find_matches(template, target, output)
    print output


if __name__ == '__main__':
    main()

<强>输出

['ab', 'bcd', 'da']
abcdab
[('ab', 'ab'), ('ab',), ('bcd', 'ab'), ('bcd',), ('da', 'ab'), ('da',)]