2011-11-29 4 views
2

고정 된 문자가 포함 된 문자열이 있습니다. 다른 문자 또는 문자열로 대체하여 문자열의 순열을 생성 할 수 있습니까 ?? 같은 출력 파이썬은 문자열에서 선택적으로 문자를 대체합니다.

designatedstring="u" 
replacerstring="ough" 
s="thruput" 

내가 원하는 :

l=["throughput","thrupought","throughpought"] 

이 작업을 수행 할 수있는 방법이 있나요 말은, 나는 이런 식으로 뭔가를?

질문에 주어진 입력에서
+0

는 = U 일이 무엇인지와는 UU 교체, 당신은 AuuA의 출력이 하나 또는 두 개의 AuuuA을 가지고있는 출력을 원하는가? – ideerge

답변

4

itertools 설탕 :

>>> parts = s.split(designatedstring) 
>>> num = len(parts) - 1 
>>> replacements = itertools.product([designatedstring, replacerstring], repeat=num) 
>>> replacements = list(replacements) 
>>> replacements.remove((designatedstring,) * num) 
>>> for r in replacements: 
...  print ''.join(itertools.chain(*zip(parts, r + ('',)))) 
... 
thrupought 
throughput 
throughpought 

당신이 결과에 원래의 문자열로 견딜 수 있다면, 당신이 할 수있는 4 라인과 5 라인에서 추한 변환을 생략하십시오.

+0

당신은 몇 초 동안 나보다 빨랐어 요! : o +1 – mac

-1

이 요청 목록을 생성합니다 :

s="thruput" 
designatedstring="u" 
replacerstring="ough" 

l = [] 
for i in range(len(s)): 
    if s[i] == designatedstring: 
     l += [s[:i] + replacerstring + s[i + 1:]] 

l += [s.replace(designatedstring, replacerstring)] 
+0

's = "tututu"' – DrTyrsa

+0

@DrTyrsa로 시도해보십시오. 'toughtoughtu', 'toughtutough'및 'tutoughtough'문자열을 만들지는 않을 것입니다. 어떤 기술적으로 질문에 지정되지 않았습니다. ;) –

0

내가 아직 itertools 해결책을 사용하고 있지만 흥미로운 방법이 있습니다.

생성하는 문자열 목록은 도덕적으로 이진 트리라는 점에 유의하십시오. 문자열에서 대체 문자의 각 인스턴스에서 무시 ("왼쪽") 또는 바꾸기 ("오른쪽 오른쪽")를 원할 수 있습니다. 따라서 대체 문자열에서 이진 트리 구조를 만들 수 있습니다. 이진 트리의 잎을 걷는 것은 쉽습니다.

class ReplacementTree(object): 
    def __init__(self, s, src, target, prefix=""): 
     self.leaf = src not in s 
     if 1 == len(s.split(src, 1)): 
      self.head, self.tail = s, "" 
     else: 
      self.head, self.tail = s.split(src, 1) 
     self.prefix, self.src, self.target = prefix, src, target 

    @property 
    def value(self): 
     if self.leaf: 
      return self.prefix + self.head 

    @property 
    def left(self): 
     if self.leaf: 
      return None 
     else: 
      return ReplacementTree(self.tail, 
            self.src, 
            self.target, 
            prefix=self.prefix + self.head + self.src) 

    @property 
    def right(self): 
     if self.leaf: 
      return None 
     else: 
      return ReplacementTree(self.tail, 
            self.src, 
            self.target, 
            prefix=self.prefix + self.head + self.target) 

def leaves(tree): 
    if tree.leaf: 
     yield tree.value 
    else: 
     for leaf in leaves(tree.left): 
      yield leaf 
     for leaf in leaves(tree.right): 
      yield leaf 

예 : 지정된 경우

>>> x = repltree.ReplacementTree("thruput", "u", "ough") 
>>> list(repltree.leaves(x)) 
['thruput', 'thrupought', 'throughput', 'throughpought'] 
관련 문제