3

我正在编写一个读取 CSV 文件并创建双端队列列表的 Python 脚本。如果我在添加之前准确打印出添加到列表中的内容,它看起来就像我想要的,但是当我打印出列表本身时,我可以看到 append 正在用最新的元素覆盖列表中的所有元素。

    # 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函数中,您修改了输入 deque ( window),然后返回修改后的deque. 因此,您将 adeque放入列表的第一个元素中,然后修改该对象(内部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 回答