3

CSVファイルを読み取り、両端キューのリストを作成するPythonスクリプトを作成しています。リストに追加される前に追加されたものを正確に印刷すると、希望どおりに見えますが、リスト自体を印刷すると、追加によってリスト内のすべての要素が最新のもので上書きされていることがわかります。

    # Window is a list containing many instances            
def slideWindow(window, nextInstance, num_attributes):
    attribute = nextInstance.pop(0)
    window.popleft()
    for i in range(num_attributes):
        window.pop()
    window.extendleft(reversed(nextInstance))
    window.appendleft(attribute)
    return window

def convertDataFormat(filename, window_size):
    with open(filename, 'rU') as f:
        reader = csv.reader(f)

        window = deque()
        alldata = deque()

        i = 0
        for row in reader:
            if i < (window_size-1):
                window.extendleft(reversed(row[1:]))
                i+=1
            else:
                window.extendleft(reversed(row))
                break

        alldata.append(window)

        for row in reader:
            window = slideWindow(window, row, NUM_ATTRIBUTES)
            alldata.append(window)
#             print alldata

        f.close()
        return alldata
4

2 に答える 2

3

これは、このコードから正確に何を求めているかを追跡するのは非常に困難です。問題は次のところにあると思います。

alldata.append(window)

for row in reader:
    window = slideWindow(window, row, NUM_ATTRIBUTES)
    alldata.append(window)

slideWindow関数で、入力両端キューwindow)を変更してから、変更されたを返すことに注意してくださいdeque。したがって、dequeリストの最初の要素にを入れてから、そのオブジェクト(内部slideWindow)を変更し、同じオブジェクトへの別の参照をリストに追加します。

それはあなたがやろうとしていることですか?

簡単な修正は、window入力をコピーしてslideWindow、コピーを変更/返すことです。

于 2012-08-10T02:35:43.837 に答える
1

確かなことはわかりませんが、この問題に似ているのではないかと疑っていますhttp://forums.devshed.com/python-programming-11/appending-object-to-list-overwrites-previous-842713。 html

于 2012-08-10T02:30:54.337 に答える