0

m Google チュートリアルから Python を学んでいます。リストに関連する演習に行き詰まっています。インデックスエラーを取得する

  lis[j]=words.pop()[i]
IndexError: string index out of range

リストを並べ替える必要がありますが、x で始まる単語が最初の単語である必要があります。

コードは

def front_x(words):
    i=0
    lis=[]
    j=0
    k=0
    words.sort()

    while i<len(words):
        if words[i][0:1]=="x":
            lis[j]=words.pop()[i]
            j+=1
        i+=1
    lis.extend(words)
    while k<len(lis):
        print(lis[k])
        k+=1
    return
4

2 に答える 2

5

lisが空のリストの場合、どのインデックスでも例外が発生します。

そのリストに要素を追加したい場合は、lis.append()代わりに を使用してください。

シーケンスを直接ループできることに注意してください。独自のカウンターを保持する必要はありません。

def front_x(words):
    lis = []
    words.sort()

    for word in words:
        if word.startswith("x"):
            lis.append(word)
    for entry in lis:
        print(entry)

で始まるすべての単語をすぐに出力することで、これをさらに減らすことができますx。別のリストを作成する必要はありません。

def front_x(words):
    for word in sorted(words):
        if word.startswith("x"):
            print(word)

xすべての単語が最初になるようにリストを並べ替える場合は、カスタムの並べ替えキーを使用します。

def front_x(words):
    return sorted(words, key=lambda w: (not w.startswith('x'), w))

.startswith('x');のブール値フラグで最初に単語を並べ替えます。Falseは前にソートされるTrueので、そのテストを否定し、次に単語自体を否定します。

デモ:

>>> words = ['foo', 'bar', 'xbaz', 'eggs', 'xspam', 'xham']
>>> sorted(words, key=lambda w: (not w.startswith('x'), w))
['xbaz', 'xham', 'xspam', 'bar', 'eggs', 'foo']
于 2013-06-28T11:28:03.293 に答える