2014-04-01 2 views
0

제 (파이썬) 다음당신이 달성 할 방법

List 1: qw,wq 

이제 각 부분 집합의 각 요소에 첫 번째 요소 앞과 뒤에 전자를 추가

List 2: eqw, qew, qwe, ewq, weq, wqe 

목록 1은 어떤 비율로도 구성 될 수 있도록 일반적으로 작성되어야합니다.

나는 재귀를 생각하고 있었지만, 아직 내 함수는 많은 if/elses를 사용하고 있으며 너무 좋지 않다.

+0

집합 또는 목록이 있습니까? – Hyperboreus

+0

좋아하는 것을 선택하십시오. – nottinhill

+0

세트는 순서가 없으므로 질문이 나옵니다. 목록과 함께 답변을 게시했습니다. – Hyperboreus

답변

3

이 일할 수 :

a = ['qw', 'wq', 'test'] 

def merge (tgt, letter): 
    for i, _ in enumerate (tgt): 
     yield tgt [:i] + letter + tgt [i:] 
    yield tgt + letter 

b = [x for tgt in a for x in merge (tgt, 'e') ] 
print (b) 

['eqw', 'qew', 'qwe', 'ewq', 'weq', 'wqe', 'etest', 'teest', 'teest', 'teset', 'teste'] 

을 인쇄 나는이 예상 된 결과입니다 바랍니다.


또는 고려 스티븐의 입력을 고려 : 약간 청소기 방식으로 발전기를 사용

def merge (tgt, letter): 
    for i in range (len (tgt) + 1): 
     yield tgt [:i] + letter + tgt [i:] 
+0

열거 형을 사용하지 마십시오 (x) range는 충분합니다.) –

+0

@StevenRumbalski True이면 충분합니다. 그에 따라 편집 할 것입니다. – Hyperboreus

+0

그것이 효과가 있었고, 나는 수확량 없이도 관리했다. – nottinhill

2

elements = ['qw', 'wq'] 

def silly_op(lst, char): 
    for e in lst: 
     for i in range(len(e) + 1): 
      yield e[:i] + char + e[i:] 

print(list(silly_op(elements, 'e'))) 

인쇄

['eqw', 'qew', 'qwe', 'ewq', 'weq', 'wqe'] 

아니 재귀, 어떤 경우 , 단지 2 중첩 된 l oops + 생성기.

물론

당신이 목록으로 결과를 얻으려면, 당신은 쓸 수


또는

def silly_op(lst, char): 
    rv = [] 

    for e in lst: 
     for i in range(len(e) + 1): 
      rv.append(e[:i] + char + e[i:]) 

    return rv 
@AdamSmith에 의해 제안 문제는, 순열에 대한 경우,

print(list(''.join(i) for i in itertools.permutations('wq' + 'e'))) 

인쇄물

['wqe', 'weq', 'qwe', 'qew', 'ewq', 'eqw'] 
+0

금 도금 대신 자신의 솔루션을 게시하는 것이 어떻습니까? – Hyperboreus

+0

정말 제네레이터를 사용하고 싶지 않습니다.또한 중첩 된 루프는 n^2의 크기 순서를 나타냅니다. 특히 자랑스러워 할 사항은 없습니다. 또한 함수 이름이 silly_op 인 이유는 무엇입니까? – nottinhill

+0

여기 비판에 대답하려면 : 1. 정말로, 발전기를 사용할 필요가 없습니다. 2. 내 코드에는 이전 대답과 같은 양의 루프가 있습니다. 3. n^2 루프가 없으며 nm 루프가 있습니다. 생성 된 목록에 n * m 요소가 포함되어 있으므로이 작업을 더 빠르게 수행 할 수 없습니다. –

관련 문제