2017-12-29 16 views
4

文字列内の2文字をすべてスワップし、リストに出力します(後ですべての文字列をチェックします)文字列内の2文字をスワップし、生成された文字列をPythonのリストに格納します

文字を一度にスワップするコードをいくつか見たことがありますが、それは私が探しているものではありません。例えば

var = 'abcde' 

予想される出力:

['bacde','acbde','abdce','abced'] 

私はPythonでこれを行うことができますどのように?

+1

なぜ ' 'acbde'、 'abdce'、 'ABCDE']'終わりで? –

+0

ああ、私の悪い、申し訳ありません、私はポストを編集します! – Ran

答えて

4

あなたはこれを達成するには、以下のリスト内包表現を使用することがあります。ご期待出力リストから最後のエントリを仮定し

>>> var = 'abcde' 

#       v To reverse the substring 
>>> [var[:i]+var[i:i+2][::-1]+var[i+2:] for i in range(len(var)-1)] 
['bacde', 'acbde', 'abdce', 'abced'] 
+0

ありがとう、完璧に動作します:) – Ran

2

はタイプミスであり、それは、ここでは、行くパターンを維持するために'abced'でなければならないこと(それはあなたのユースケースに基づいて正確に一般化している場合はまだわからない)一つの方法は次のとおりです。

In [5]: x 
Out[5]: 'abcde' 

In [6]: [x[:i] + x[i+1] + x[i] + x[i+2:] for i in range(len(x)-1)] 
Out[6]: ['bacde', 'acbde', 'abdce', 'abced'] 
2

ジェネレータ関数は、長い文字列のためにあまりにも多くのメモリを使用しません。

ここ
def swap_pairs(s): 
    for i in range(len(s) - 1): 
     yield s[:i] + s[i + 1] + s[i] + s[i + 2:] 

>>> swap_pairs('abcde') 
<generator object swap_pairs at 0x1034d0f68> 
>>> list(swap_pairs('abcde')) 
['bacde', 'acbde', 'abdce', 'abced'] 
1

reアプローチです:

x = 'abcde' 
[re.sub(f'(.)(.)(?=.{{{i}}}$)', "\\2\\1", x) for i in reversed(range(len(x)-1))] 
# ['bacde', 'acbde', 'abdce', 'abced'] 

とDOUBLEの文字をスキップし変種:

x = 'abbde' 
[s for s, i in (re.subn(f'(.)(?!\\1)(.)(?=.{{{i}}}$)', "\\2\\1", x) for i in reversed(range(len(x)-1))) if i] 
# ['babde', 'abdbe', 'abbed'] 
+0

'反転(範囲(len(x)-1))'?私は –

+0

@ Jean-FrançoisFabre...の代わりに 'range(len(x)-1、-1、-1)'のようなものを使用していたでしょう。私が間違っていないなら、 'range(len(x)-2、-1、-1)'は等価でなければなりません。そういうわけで、私はしばしば「逆転した」読みやすさを感じます。 –

+0

はい、ソリューションをテストしませんでした。しかし、私は 'レンジ'(コードゴルフの習慣)で '逆転 'を使うのは好きではない –

関連する問題