在lis中追加后列表项

2024-04-25 15:14:53 发布

您现在位置:Python中文网/ 问答频道 /正文

为了更好地理解,我简化了清单。 我有一个动态变化的列表(比如说):

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

我最好的猜测是我应该有一些临时工。变量或将列表更改为元组。你知道吗


Tags: in列表ifcountlistprintblaappend
2条回答

我相信引起你问题的部分是-

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)-你就是在列表中附加列表引用。你知道吗

当你这么做的时候-

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 = []

您可以使用^{}函数和^{}方法来检查您的列表是否包含与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]]

相关问题 更多 >

    热门问题