2

私が意図したこと:

list pop() メソッドに似た my_pop() という関数を実装します。入力としてリストを受け取り、リストから最後のオブジェクトを削除して返します。

私が思いついたもの:

# take an input of list;
# if not last item(determined by comparing index number): loop through the list and copy every item to new list
# if last item: pass

def my_pop(l):
    new = []
    l = list(l)
    for i in l:
        if l.index(i) == -1:
            pass
        else:
            new.append(i)
    return new

問題:new実行すると、古い list の正確なコピーとしてリストが返されl、 の最後の項目が削除されませんl。自分のやり方がうまくいかない理由を理解できませんでした。一般的な指針は大歓迎です!ありがとうございました。

解決策: 以下の優れた回答のおかげで、うまくいかない理由がわかりましたif l.index(i) == -1。ここに貼り付けたのは、@ jh314 の洞察に基づく同様のソリューションですが、代わりに while ループを使用しています。

# take an input of list;
# compare the index using c to determine if it's the last element in the list;

def pop(l):
    n = []
    l = list(l)
    c = 0
    while c < int(len(l)-1):
        n.append(l[c])
        c = c + 1
    else:
        pass

    return n
4

3 に答える 3

1

コードにはいくつかの問題があります。

  1. pop関数は新しいリストではなく、古いリストの最後の要素を返します-関数が新しいリストを返しているようです。
  2. index 関数は常に正のインデックスを返します。なぜリストの最後の要素に -1 としてアクセスできるのかを思い出してください。実際のインデックスはlen(l)-1. さらに、最後の要素がリスト内の別の要素と同一である場合はどうなるでしょうか?

    [1,2,3,1].index(1)

    この式は何に評価されると思いますか? おっとっと!

  3. 「古い」リストと「新しい」リストについて話しましたが、実際にはどちらも同じリストです。コードは変更されたリストのコピーを返しますが、古いリストは同じままです。delリストをその場で変更する のようなものを使用して修正できます。

于 2013-06-21T21:22:54.530 に答える
0
    def my_pop(lst):
        if len(lst) <= 1 : # "if last item: pass"
            return
        last_item_in_list = lst[-1] # that is what we want to return 
        del lst[-1] 
        # deletes an an item from a list 
        # (see http://docs.python.org/2/tutorial/datastructures.html#the-del-statement )
        #
        return last_item_in_list
于 2013-06-21T23:28:03.073 に答える