列入清单后列出项目消失

时间:2015-08-13 10:25:50

标签: python list append

我简化了列表以便更好地理解。 我有一个动态改变的列表(比方说):

recPkt = [10, 1, 38, 64]

想要检查列表是否与列表中的某些列表匹配(如下图所示)。此列表列表从txt文件中读取。

mDdata = [[10, 1, 37, 6], '|', [10, 1, 37, 64], '|', [10, 1, 37, 45], '|', [10, 1, 37, 51]]

如果列表不在里面,我想将它附加到列表列表(mDdata)。

我的问题是当我追加时。更新后的列表未正确保存。它是列表中的所有列表是相同的,只有最后一个列表是不同的或空列表被附加(取决于我放置pcktLst [:] = []的位置)

if isDev == 1: #device is on list
    devdata = []
    devdata [:] = []
    pcktLst = []
    pcktLst [:] = []
    ind = myReadList.index(devAddr+"-END"+"--------------------------------------------")
    devdata = myReadList [iJ + 10: ind] 
    devdata = str(devdata)
    x = devdata.find("(")
    y = devdata.find(")")

    devdata = devdata[(x+1):(y)]
    devdata = devdata.split('|')

    mDdata = []
    mDdata [:] = []
    s = 0
    devLst = []
    devLst [:] = []
    dd = readDtoL(devdata) #returns list of list of existing data in txt file

    count = 0


    for eaItm in dd:
        eaItm = eaItm.replace("[","")
        eaItm = eaItm.replace("]","")
        eaItm = eaItm.split(", ")

        pcktLst [:] = []
        print eaItm
        print dd
        for eaNumb in eaItm:
            print  eaNumb
            eaNumb = int(eaNumb)
            pcktLst.append(eaNumb)

        devLst =  pcktLst
        if count == 0 :
            mDdata.append(devLst)
            print mDdata

        elif count > 0:
            mDdata.append("|")
            mDdata.append(devLst)
            print "Count"
            print mDdata
        count+=1
        pcktLst [:] = []

    bla = []
    bla [:] = []
    for eNumb in recPkt:
        #print  eNumb
        eNumb = int(eNumb)
        bla.append(eNumb)

    print bla
    #print mDdata
    if (bla in mDdata) == False:
        mDdata.append("|")
        mDdata.append(bla)
    print "TOLE JE PO APPEND"
    print mDdata

我最好的猜测是我应该有一些温度。变量或更改列表到元组。

2 个答案:

答案 0 :(得分:3)

我认为造成您问题的部分是 -

devLst =  pcktLst
if count == 0 :
    mDdata.append(devLst)
    print mDdata

elif count > 0:
    mDdata.append("|")
    mDdata.append(devLst)
    print "Count"
    print mDdata
count+=1
pcktLst [:] = []

当你这样做时 -

devLst = pcktLst

您只是将pcktLst的引用分配给devLst,它们都引用相同的列表。当您执行 - mDdata.append(devLst)时 - 您将列表引用添加到列表mDdata中。

然后当你做 -

pcktLst [:] = []

此inplace清除pcktLst引用的列表,该列表也是列表devLst以及您刚刚附加到mDdata的lsit。你不应该这样做。一个非常简短的示例来显示此行为 -

>>> a = [1,2]
>>> b = a
>>> c = []
>>> c.append(a)
>>> c
[[1, 2]]
>>> b
[1, 2]
>>> a
[1, 2]
>>> a[:] = []
>>> a
[]
>>> b
[]
>>> c
[[]]

我猜你对[:]有一些错误的理解,当在赋值运算符的左侧使用切片时,你要求python在地址中改变列表,这将反映在所有名称中引用到列表中。你应该使用它,除非你真的需要在适当的位置变异,我认为没有必要。你可以这样做 -

pcktLst = []

这会导致pcktList指向新列表,而不会对先前指向的列表造成任何问题。你应该在任何地方使用它。

此外,当你这样做时 -

mDdata = []
mDdata [:] = []
s = 0
devLst = []
devLst [:] = []

这没有任何好处,你可以写 -

mDdata = []
s = 0
devLst = []

答案 1 :(得分:1)

您可以使用all功能和symmetric_difference (^)方法检查您的列表是否包含与mDdata中任何子列表完全相同的元素。

>>> if all(set(recPkt) ^ set(el) for el in mDdata if isinstance(el, list)):
...     mDdata.append('|')
...     mDdata.append(recPkt)
... 
>>> mDdata
[[10, 1, 37, 6], '|', [10, 1, 37, 64], '|', [10, 1, 37, 45], '|', [10, 1, 37, 51], '|', [10, 1, 38, 64]]