如何在 python 中使用 OnClick 事件保存列表以将它们添加到单个列表中并获得交集

How to save list with OnClick event in python to add them in a single list and get intersection

已编辑: 我想在 python 中找到多个列表的交集。所以首先我将添加它们以制作一个列表(列表列表),然后我使用交集函数。 让我解释一下这里发生了什么: 单击第一个按钮 - 您将从数据库 table [1, 6, 7, 8]

中获得一个列表

现在我必须在空白处添加这个 list.So 当点击第一个按钮时它应该给你相同的列表 [[1, 6, 7, 8]] 因为只有一个列表添加。

我得到 [[1, 6, 7, 8]]

第二次单击按钮 - 从数据库 [1, 2, 5, 6, 7, 8] 中获取列表

现在点击第二个按钮,我应该得到 [[1, 6, 7, 8],[1, 2, 5, 6, 7, 8]]

但我得到的是 [[1, 2, 5, 6, 7, 8]]

第三次单击按钮 - 得到一个列表 [2, 4, 7, 8]

点击第三个按钮后 [[1, 6, 7, 8],[1, 2, 5, 6, 7, 8],[2, 4, 7, 8]]

但我得到 [[2, 4, 7, 8]]

等等,这取决于用户 select 按钮的数量,我们不知道他可以 select 多少按钮。

应用交集函数后的输出 [7,8]

所以最后我可以有 n 个列表,我已经添加它们并得到 listoflists.When 我 运行 下面的代码它给了我上面提到的输出 above.I 已经写了完整的代码,以便您了解我的 database.But 我的问题与 On Click 事件中的追加和交集有关

    self.conn = sqlite3.connect('RAMAN.db')       
    for row_id in range(1,11):
       for col_id in range(1,19):
         print row_id,col_id
         cursor= self.conn.execute("SELECT * FROM ELEMENT where ROW_NO==%d AND COLUMN_NO==%d"%(row_id,col_id))
         if(cursor==None):
            gs.Add(wx.StaticText(p,-1,''))
         else:
            elements = cursor.fetchall()
            if(elements==None or len(elements)==0):
               gs.Add(wx.StaticText(p,-1,''))
            else:
               print elements[0]
               btn = wx.Button(p, -1,str(elements[0][1]), (10,20))                              
               btn.Bind(wx.EVT_BUTTON, self.OnClick, btn)
               gs.Add(btn, -1, wx.EXPAND)   

    self.btn=wx.Button(p,-1,"Search!")
    bs.Add(self.btn,0,wx.ALIGN_CENTER)

def OnClick(self, event):                                      
    name = event.GetEventObject().GetLabelText()
    cursor= self.conn.execute("SELECT * FROM ELEMENT where SYMBOL==?", (name,))
    elements = cursor.fetchall()
    print elements
    cursor= self.conn.execute("SELECT ATOMIC_NUMBER FROM ELEMENT where SYMBOL = ?", (name,))
    numbers = cursor.fetchone()[0]
    print numbers
    atomicnumber = numbers
    cursor= self.conn.execute("SELECT MOL_NUMBER FROM LINK where ELEMENT_NUMBER = ?", (atomicnumber,))
    mnumbers = cursor.fetchall()
    print mnumbers        
    mnum_list = []
    for i in mnumbers:
         mnum_list.append(i[0])
    print mnum_list
    combinations = atomicnumber
    inter_list = []
    inter_list.append(mnum_list)
    print inter_list
    #print list(set.intersection(*map(set,inter_list))

如果顺序对你来说不重要,你可以试试这个。

l1 =[1, 6, 7, 8]
l2= [1, 2, 5, 6, 7, 8]

l3= [2, 4, 7, 8]
inter = list(set(l1)&set(l2)&set(l3))
print(inter)

输出:

[8, 7]

编辑: 如果您说将有 n 个列表,则正如 OP 所希望的那样。获取它们并将它们存储在列表列表中。

l1 =[1, 6, 7, 8]
l2= [1, 2, 5, 6, 7, 8]
l4= [6,3,7,8]
l5= [1,7,8]
l3= [2, 4, 7, 8]
listoflist = [l1,l2,l3,l4,l5]
a = listoflist[0]  #Assign the first element of listoflist to `a`

for l in listoflist:
    a=set(a)&set(l)

inter = list(a)
print(inter)

输出:

[8, 7]

您有多个列表如下,

l1 = [1, 6, 7, 8]

l2= [1, 2, 5, 6, 7, 8]

.

.

ln = [2, 4, 7, 8]

mylist = []
result = l1
for i in range(1,n):
   mylist.append(locals()['l{}'.format(i)]) 
for s in mylist:
   result = result.intersection(s)
print result 

这将首先连接所有列表,然后找到它们之间的交集。

这里我们必须在 On Click 事件之外创建 inter_list。这样:

             self.inter_list = list()  

def OnClick(self, event):                                       
    name = event.GetEventObject().GetLabelText()
    cursor= self.conn.execute("SELECT * FROM ELEMENT where SYMBOL==?", (name,))
    elements = cursor.fetchall()
    print elements
    cursor= self.conn.execute("SELECT ATOMIC_NUMBER FROM ELEMENT where SYMBOL = ?", (name,))
    numbers = cursor.fetchone()[0]
    atomicnumber = numbers
    cursor= self.conn.execute("SELECT MOL_NUMBER FROM LINK where ELEMENT_NUMBER = ?", (atomicnumber,))
    mnumbers = cursor.fetchall()
    print mnumbers
    mnum_list = []
    for i in mnumbers:
         mnum_list.append(i[0])
    print mnum_list
    self.inter_list.append(mnum_list)
    print self.inter_list
    self.molecule_list=list(set.intersection(*map(set,self.inter_list)))
    print self.molecule_list
    self.t1.AppendText(str(elements[0][0]))
    self.t1.AppendText("\n")