文字列内の2文字をすべてスワップし、リストに出力します(後ですべての文字列をチェックします)文字列内の2文字をスワップし、生成された文字列をPythonのリストに格納します
文字を一度にスワップするコードをいくつか見たことがありますが、それは私が探しているものではありません。例えば
:
var = 'abcde'
予想される出力:
['bacde','acbde','abdce','abced']
私はPythonでこれを行うことができますどのように?
文字列内の2文字をすべてスワップし、リストに出力します(後ですべての文字列をチェックします)文字列内の2文字をスワップし、生成された文字列をPythonのリストに格納します
文字を一度にスワップするコードをいくつか見たことがありますが、それは私が探しているものではありません。例えば
:
var = 'abcde'
予想される出力:
['bacde','acbde','abdce','abced']
私はPythonでこれを行うことができますどのように?
あなたはこれを達成するには、以下のリスト内包表現を使用することがあります。ご期待出力リストから最後のエントリを仮定し
>>> 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']
ありがとう、完璧に動作します:) – Ran
はタイプミスであり、それは、ここでは、行くパターンを維持するために'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']
ジェネレータ関数は、長い文字列のためにあまりにも多くのメモリを使用しません。
ここ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']
は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']
'反転(範囲(len(x)-1))'?私は –
@ Jean-FrançoisFabre...の代わりに 'range(len(x)-1、-1、-1)'のようなものを使用していたでしょう。私が間違っていないなら、 'range(len(x)-2、-1、-1)'は等価でなければなりません。そういうわけで、私はしばしば「逆転した」読みやすさを感じます。 –
はい、ソリューションをテストしませんでした。しかし、私は 'レンジ'(コードゴルフの習慣)で '逆転 'を使うのは好きではない –
なぜ ' 'acbde'、 'abdce'、 'ABCDE']'終わりで? –
ああ、私の悪い、申し訳ありません、私はポストを編集します! – Ran