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
目录位置: