如何在列表中获得具有不同定位的字符串组合?

时间:2017-09-02 20:38:01

标签: python string list position combinations

我有一个列表:

mylist = [ "abc", "def", "-" ]

我已经尝试并搜索了大量的组合,但没有任何接近它的结果,预期的结果应该与此类似(组合在不同位置的字符串组合):

[ "abc", "-abc", "abc-", "-abc-", "abcdef", "-abcdef", "abcdef-", 
"-abcdef-", "abc-def", "-abc-def-", "-abc-def", "abc-def-", "defabc",
"-defabc", "defabc-", "def-abc", "-def-abc", "def-abc-" ]

更新:

上面的例子很简单,通常有2个列表。一个常规字符串是(abc,def,...),另一个包含特殊字符(.- _等),(+可能是resultList)。例如:

regularList =  [ "abc", "def", "ghi", ... ]
specialList = [ ".", "-" ,"_" , ",", ... ]
resultList = [ "abc", "def", "abc-", "-abc", "-abc-", ..., "-abc_def-", ... ]

字符串“。”,“ - ”,“_”,...(specialList)绝不应该作为单个字符串出现在最终结果中(例如[“ - ”,“。”,“abc”,“ def“,”abcdef“,...])

我需要组合两个列表,但有一个特殊的例外(如我原来的帖子中所提到的),“specialList”的字符需要位于常规字符串组合的开头,结尾和中间。

最终结果(如前所述)通常看起来像这样:

resultList = [ "abc", "def", "abc-", "-abc", "-abc-", "abc_", 
"_abc", "_abc_", "_abc-", "-abc_", ..., 
"-abc_def-", "_abc-def_", "abc-def_", ... ]

旁注:
不确定是否需要太多的处理能力/ CPU。这就是为什么我试图逐步遍历“specialList”以获得第一个组合(然后在文件系统上验证它并迭代下一个组合),如我的orig中所述。发布/评论,所以我删除了“specialList”以简化orig中的问题。帖子,但后来我意识到像“-abc_dev-”这样的组合不可能这样,所以我原来的方法/帖子不会像我想的那样工作。

2 个答案:

答案 0 :(得分:1)

除了在您的问题中似乎打开连字符数量-)的问题之外,您可以通过加入所有可能子集的所有可能排列来实现此目的,具体来说:

from itertools import chain, combinations, permutations

def powerset(s):
    # https://stackoverflow.com/questions/7988695/getting-the-subsets-of-a-set-in-python
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

>>> mylist = [ "abc", "def", "-" ]
>>> [''.join(x) for subset in powerset(mylist) for x in permutations(subset)]
['',
 'abc',
 'def',
 '-',
 'abcdef',
 'defabc',
 'abc-',
 '-abc',
 'def-',
 '-def',
 'abcdef-',
 'abc-def',
 'defabc-',
 'def-abc',
 '-abcdef',
 '-defabc']

答案 1 :(得分:0)

你想要的是Cartesian Product,你可以通过带有 product()功能的itertool模块实现它:

import itertools

mylist = [ "abc", "def", "-" ]

[p for p in itertools.product(mylist, repeat=3)]