제 (파이썬) 다음당신이 달성 할 방법
는List 1: qw,wq
이제 각 부분 집합의 각 요소에 첫 번째 요소 앞과 뒤에 전자를 추가
List 2: eqw, qew, qwe, ewq, weq, wqe
목록 1은 어떤 비율로도 구성 될 수 있도록 일반적으로 작성되어야합니다.
나는 재귀를 생각하고 있었지만, 아직 내 함수는 많은 if/elses를 사용하고 있으며 너무 좋지 않다.
제 (파이썬) 다음당신이 달성 할 방법
는List 1: qw,wq
이제 각 부분 집합의 각 요소에 첫 번째 요소 앞과 뒤에 전자를 추가
List 2: eqw, qew, qwe, ewq, weq, wqe
목록 1은 어떤 비율로도 구성 될 수 있도록 일반적으로 작성되어야합니다.
나는 재귀를 생각하고 있었지만, 아직 내 함수는 많은 if/elses를 사용하고 있으며 너무 좋지 않다.
이 일할 수 :
는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:]
열거 형을 사용하지 마십시오 (x) range는 충분합니다.) –
@StevenRumbalski True이면 충분합니다. 그에 따라 편집 할 것입니다. – Hyperboreus
그것이 효과가 있었고, 나는 수확량 없이도 관리했다. – nottinhill
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']
금 도금 대신 자신의 솔루션을 게시하는 것이 어떻습니까? – Hyperboreus
정말 제네레이터를 사용하고 싶지 않습니다.또한 중첩 된 루프는 n^2의 크기 순서를 나타냅니다. 특히 자랑스러워 할 사항은 없습니다. 또한 함수 이름이 silly_op 인 이유는 무엇입니까? – nottinhill
여기 비판에 대답하려면 : 1. 정말로, 발전기를 사용할 필요가 없습니다. 2. 내 코드에는 이전 대답과 같은 양의 루프가 있습니다. 3. n^2 루프가 없으며 nm 루프가 있습니다. 생성 된 목록에 n * m 요소가 포함되어 있으므로이 작업을 더 빠르게 수행 할 수 없습니다. –
집합 또는 목록이 있습니까? – Hyperboreus
좋아하는 것을 선택하십시오. – nottinhill
세트는 순서가 없으므로 질문이 나옵니다. 목록과 함께 답변을 게시했습니다. – Hyperboreus