4

方法 1 が正しく、方法 2 が間違っている理由を知りたいです。

方法1:

def remove_duplicates(x):
    y = []
    for n in x:
        if n not in y:
            y.append(n)
    return y

方法 2:

def remove_duplicates(x):
    y = []
    for n in x:
        if n not in y:
            y = y.append(n)
    return y

2 番目のメソッドが間違った答えを返す理由がわかりません。

4

1 に答える 1

16

list.appendメソッドは を返しますNone。にy = y.append(n) 設定yNoneます。

の最後の反復でこれが発生した場合はfor-loop、 thenNoneが返されます。

最後の繰り返しの前に発生した場合は、次回のループで、

if n not in y

上げます

TypeError: argument of type 'NoneType' is not iterable

注: ほとんどの場合、方法 1 よりも高速に重複を削除する方法がありますが、その方法は、順序を維持するかどうか、アイテムが注文可能かどうか、およびアイテムxがハッシュ可能かどうかによって異なります。

def unique_hashable(seq):
    # Not order preserving. Use this if the items in seq are hashable, 
    # and you don't care about preserving order.
    return list(set(seq))

def unique_hashable_order_preserving(seq): 
    # http://www.peterbe.com/plog/uniqifiers-benchmark (Dave Kirby)
    # Use this if the items in seq are hashable and you want to preserve the
    # order in which unique items in seq appear.
    seen = set()
    return [x for x in seq if x not in seen and not seen.add(x)]

def unique_unhashable_orderable(seq):
    # Author: Tim Peters
    # http://code.activestate.com/recipes/52560-remove-duplicates-from-a-sequence/
    # Use this if the items in seq are unhashable, but seq is sortable
    # (i.e. orderable). Note the result does not preserve order because of
    # the sort.
    # 
    # We can't hash all the elements.  Second fastest is to sort,
    # which brings the equal elements together; then duplicates are
    # easy to weed out in a single pass.
    # NOTE:  Python's list.sort() was designed to be efficient in the
    # presence of many duplicate elements.  This isn't true of all
    # sort functions in all languages or libraries, so this approach
    # is more effective in Python than it may be elsewhere.
    try:    
        t = list(seq)
        t.sort()
    except TypeError:
        del t
    else:
        last = t[0]
        lasti = i = 1
        while i < len(seq):
            if t[i] != last:
                t[lasti] = last = t[i]
                lasti += 1
            i += 1
    return t[:lasti]

def unique_unhashable_nonorderable(seq):
    # Use this (your Method1) if the items in seq are unhashable and unorderable.
    # This method is order preserving.
    u = []
    for x in seq:
        if x not in u:
            u.append(x)
    return u

NumPy があり、seq 内の項目が順序付け可能である場合、これが最速になる可能性があります。

import numpy as np
def unique_order_preserving_numpy(seq):
    u, ind = np.unique(seq, return_index=True)
    return u[np.argsort(ind)] 
于 2013-05-28T17:50:03.727 に答える