我简化了列表以便更好地理解。 我有一个动态改变的列表(比方说):
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
我最好的猜测是我应该有一些温度。变量或更改列表到元组。
答案 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]]