python笛卡爾積
Ⅰ tuple在python中什麼意思
元組(tuple)是關系資料庫中的基本概念,關系是一張表,表中的每行(即資料庫中的每條記錄)就是一個元組,每列就是一個屬性。 在二維表裡,元組也稱為行。
笛卡爾積中每一個元素(d1,d2,…,dn),叫作一個n元組(n-tuple)或簡稱元組。當關系是一張表,二維表中的行表中的每行(即資料庫中的每條記錄)就是一個元組,每列就是一個屬性。在二維表裡,元組也稱為記錄。
簡介:
Python由荷蘭數學和計算機科學研究學會的Guido van Rossum於1990 年代初設計,作為一門叫做ABC語言的替代品。Python提供了高效的高級數據結構,還能簡單有效地面向對象編程。
Python語法和動態類型,以及解釋型語言的本質,使它成為多數平台上寫腳本和快速開發應用的編程語言,隨著版本的不斷更新和語言新功能的添加,逐漸被用於獨立的、大型項目的開發。
Ⅱ Python中斷多重循環的幾種思路
事實上,Python的標准語法是不支持跳出多重循環的,所以只能利用一些技巧,大概的思路有:寫成函數、利用笛卡爾積、利用調試。
寫成函數
在Python中,函數運行到return這一句就會停止,因此可以利用這一特性,將功能寫成函數,終止多重循環,例如
def work(): for i in range(10): for j in range(10): if i+j > 5: return i,jprint work()
利用笛卡爾積
這種方法的思路就是,既然可以跳出單循環,我就將多重循環改寫為單循環,這可以利用itertools中的笛卡爾積函數proct,例如
from itertools import proctfor i,j in proct(range(10), range(10)): if i+j > 5: print i,j break
利用調試模式
笛卡爾積的方式很巧妙,也很簡潔,但它只能用於每次循環的集合都是獨立的情形,假如每層循環都與前一層緊密相關,就不能用這種技巧了。這時候可以用第一種方法,將它寫成函數,另外,還可以利用調試模式。這個利用了調試模式中,只要出現報錯就退出的原理,它偽裝了一個錯誤出來。
class Found(Exception): passtry: for i in range(10): for j in range(i): #第二重循環跟第一重有關 if i + j > 5: raise Foundexcept Found: print i, j
Ⅲ Excel的公式參照有不定數的同碼重復列,以設定的條件,依序讀取也有不定數的同碼重復的列
按你的需求,用excel公式不可能實現,H!B列和CP!D列有重復值是硬傷,兩張表這兩個欄位進行關聯後,記錄數將是笛卡爾積,而不是你要求的取B列中重復記錄個數。
用python去寫吧,更容易實現一些。
Ⅳ 請問資料庫里的元組是什麼意思
元組是關系資料庫中的基本概念,是事物特徵的組合,可以描述一個具體的事物。
關系是一張表,表中的每行(即資料庫中的每條記錄)就是一個元組,元組的集合稱為關系,每列就是一個屬性。 在二維表裡,元組也稱為行,屬性為列。
4、主鍵:能唯一標識信息的事物。
5、外鍵:一個執行另個一個表的指針。
Ⅳ 應用並交差可以得到多少個
4個。
關系代數中的操作可以分為兩類傳統的關系操作,並、差、交、笛卡爾積。他們的圖示可以表示為但是這樣看可能不好理解,python的set是一個無序不重復元素集,基本功能包括關系測試和消除重復元素。
Ⅵ 計算機二級。選擇和投影到底有什麼區別
選擇是從行的角度進行的運算;投影操作是從列的角度進行的運算。選擇是在關系R中選擇滿足給定條件的諸元組,投影是從R中選擇出若干屬性列組成新的關系。
1、選擇又稱為限制,它是在關系R中選擇滿足給定條件的諸元組,記作:σf(R)={t|t∈R∧F(t)="真‟}。其中F表示選擇條件,它是一個邏輯表達式,取邏輯值「真」或「假"。邏輯表達式F的基本形式為:X1 θ Y1[φ X2 θ Y2] …,其中θ表示比較運算符號,可以是>、≥、<、≤、=或≠。X1,Y1等是屬性名或常量或簡單函數。屬性名也可以用它的序號來代替。θ表示邏輯運算符,可以是∧或∨等。[]表示任選項。即[]中的部分可以要也可以不要。因此選擇運算實際上是從關系R中選取使邏輯表達式F為真的元組,這是從行的角度進行的運算。
2、投影。關系R上的投影是從R中選擇出若干屬性列組成新的關系。記作:∏A(R) = { t[A] | t∈R } 其中A為R中的屬性列。投影操作是從列的角度進行的運算。
(6)python笛卡爾積擴展閱讀:
1、對關系實施的各種操作,包括選擇、投影、連接、並、交、差、增、刪、改等,這些關系操作可以用代數運算的方式表示,其特點是集合操作。完整性約束 完整性約束包括實體完整性、參照完整性和用戶定義完整性。
2、基本的關系操作。關系模型中常用的關系操作包括查詢操作和插入、刪除、修改操作兩大部分。關系的查詢表達能力很強,是關系操作中最主要的部分。查詢操作可以分為:選擇、投影、連接、除、並、差、交、笛卡爾積等。其中,選擇、投影、並、差、笛卡爾積是五種基本操作。
3、關系資料庫中的核心內容是關系即二維表。而對這樣一張表的使用主要包括按照某些條件獲取相應行、列的內容,或者通過表之間的聯系獲取兩張表或多張表相應的行、列內容。概括起來關系操作包括選擇、投影、連接操作。關系操作其操作對象是關系,操作結果亦為關系。
Ⅶ python 關聯規則分前項後項嗎
學了兩天python,想實踐下,正好最近在學習數據挖掘,先用python實現下
註:由於後面加了注釋,由於編碼問題,可能即使是注釋,有的環境也不支持漢字的編碼,運行報錯的話可以將漢字刪除後再運行
環境 ubuntu 13.4 python 2
[python]view plain
importitertools
import
'''''
定義全局變數k,即支持度計數k,此k也可以在運行程序之前輸入,簡單改動即可
'''
k=2
'''''
存儲頻繁項集的列表
'''
frequenceItem=[]
'''''
從txt文件dataset.txt里獲取事務集
'''
defgetDataSet(args):
f=open(args,'r')
source=f.readlines()
f.close()
dataset=[]
forlineinsource:
temp1=line.strip(' ')
temp2=temp1.split(',')
dataset.append(temp2)
returndataset
'''''
初步掃描事務集,從事務集里獲取候選1項集
方法的基本思路是:
定義一個集合tmp,將事務集的第一項作為tmp的初始集合
然後掃描事務集,將不在tmp里的數據項加入tmp中
'''
deffind_item(dataset):
length=len(dataset)
foriinrange(0,length):
ifi==0:
tmp=set(dataset[i])
tmp.update(set(dataset[i]))
candidate=list(tmp)
candidate.sort()
returncandidate
'''''
從候選項集里找出頻繁項集,其中num代表頻繁num+1項集
如num為0的為從候選1項集里找出頻繁1項集
方法基本思路:
1、定義一個支持度列表count
2、對於每一個候選項,依次掃描事務集,如果該項出現在事務集中就將該項對應的count+1、定義一個支持度列表count+1
3、將每一項的count和k(支持度計數)進行比較,將count小於k的項剔除
'''
deffind_frequent(candidate,dataset,num):
frequence=[]
length=len(candidate)
count=[]
foriinrange(0,length):
count.append(0)
count[i]=0
ifnum==0:
'''''
其實不管num為0還是別的值演算法應該是一樣的,但是由於程序實現上的問題
num為0的時候選項集是一維列表,其它的時候,候選項集是二維列表,
畢竟只是自己寫著玩的,python還不熟,牽一發而動全身,懶得改了
'''
child=set([candidate[i]])
else:
child=set(candidate[i])
forjindataset:
parent=set(j)
ifchild.issubset(parent):
count[i]=count[i]+1
forminrange(0,length):
ifcount[m]>=k:
frequence.append(candidate[m])
returnfrequence
'''''
先驗定理,剪枝掉不必要的候選n項集
方法思路:
1、依次取出候選項集里的項
2、取出n項集里的n-1項子集
3、如果所有的n-1項集不都都是頻繁n-1項集的子集,則刪除該候選項集
'''
defpre_test(candidate,num,frequence):
r_candidate=.deep(candidate)
foreachincandidate:
foreach2initertools.combinations(each,num):
tmp=(list(each2))
tag=0
forjinfrequence:
ifnum==1:
if(tmp[0]==j):
tag=1
break
else:
iftmp==j:
tag=1
break
iftag==0:
r_candidate.remove(each)
break
returnr_candidate
'''''
通過頻繁n-1項集產生候選n項集,並通過先驗定理對候選n項集進行剪枝
方法思路:
1、如果是頻繁1項集,則通過笛卡爾積產生頻繁2項集
2、如果不是頻繁一項集,採用F(k-1)*F(k-1)方法通過頻繁n-1項集產生候選n項集
註:F(k-1)*F(k-1)方法在我的另一篇關聯演算法博客上做了理論上的簡單介紹,或者也可以直接參看《數據挖掘導論》
'''
defget_candidata(frequence,num):
length=len(frequence)
candidate=[]
ifnum==1:
foreachinitertools.combinations(frequence,2):
tmp=list(each)
tmp3=[]
tmp3.append(tmp[0])
tmp3.append(tmp[1])
candidate.append(tmp3)
else:
foriinrange(0,length-1):
tmp1=.deep(frequence[i])
tmp1.pop(num-1)
forjinrange(i+1,length):
tmp2=.deep(frequence[j])
tmp2.pop(num-1)
iftmp1==tmp2:
tmp3=.deep(frequence[i])
tmp3.append(frequence[j][num-1])
candidate.append(tmp3)
candidate2=pre_test(candidate,num,frequence)
returncandidate2
'''''
main程序
'''
if__name__=='__main__':
dataset=getDataSet('dataset.txt')
Item=find_item(dataset)
num=0
frequenceItem=[]
'''''
通過事務集找到頻繁項集,直至頻繁n項集為空,則退出循環
'''
while1:
ifnum==0:
candidate=Item
else:
candidate=get_candidata(frequenceItem[num-1],num)
frequenceItem.append(find_frequent(candidate,dataset,num))
iffrequenceItem[num]==[]:
frequenceItem.pop(num)
break
num=num+1
'''''
列印出頻繁項集
'''
foreachinfrequenceItem:
printeach
目錄位置: