はい、[2:]
そこに追加することで機能が改善されますが、range(len(original))
. 書いていることに気づいたときはいつでもrange(len(something))
、一歩下がって、実際に何をしようとしているのかを考えるべきです。
この場合、文字列内の文字を探しており、 を使用するとより簡単に取得できますfor x in string
。これらのアイデアを考慮して、わずかに改善されたバージョンを次に示します。
def expand(original):
var = ""
symbols = original[:2]
for digit in original[2:]:
var += (digit + symbols)
return var
これにより、出力の最初に奇妙な記号が混在するのを防ぐことができますが、それでも完全ではありません。
>>> expand('+*1234')
'1+*2+*3+*4+*'
私たちは方法を見つける必要があります
- シンボルを交互に取り、
- 文字列の最後からそれらを残します。
itertools.cycleを使用してこれらの最初のものを処理し、2 番目の文字列スライスを処理できます。
from itertools import cycle
def expand(original):
var = ""
symbols = cycle(original[:2])
for digit in original[2:]:
var += (digit + next(symbols))
return var[:-1]
それは機能しますが、ある時点で、効率が悪いため、文字列を使用し+
たり作成したりするべきではないと誰かがパイプで言います。+=
代わりにリストを作成し、それを使用str.join()
して文字列に変換すると、少し改善できます。
from itertools import cycle
def expand(original):
chars = []
symbols = cycle(original[:2])
for digit in original[2:]:
chars.extend([digit, next(symbols)])
return "".join(chars[:-1])
しかし、私たちはそれ以上のことをすることができます。next(symbols)
毎回呼び出す必要はなく、一度zip()
に次のシンボルと次の数字のペアを取得するために使用できます。
from itertools import cycle
def expand(original):
chars = []
for symbol, digit in zip(cycle(original[:2]), original[2:]):
chars.extend([digit, symbol])
return "".join(chars[:-1])
...そしておそらくそれで十分です:-)
編集:別の回答へのコメントで、標準ライブラリから何もインポートできないと言ったので(かなりばかげた制限IMOですが、そこにあります)、cycle()
リンクで説明されているPython実装を使用できますこの回答の前半:
def cycle(iterable):
# cycle('ABCD') --> A B C D A B C D A B C D ...
saved = []
for element in iterable:
yield element
saved.append(element)
while saved:
for element in saved:
yield element
...しかし、おそらく、 yieldキーワードを理解する必要があることを意味し、それを理解していることを先生に納得させる準備をしておく必要があります。