Python 如何查找CSV文件中任意两个元素的共享属性

Python 如何查找CSV文件中任意两个元素的共享属性,python,list,loops,csv,Python,List,Loops,Csv,我有以下csv文件: A,rule1 B,rule1 C,rule2 A,rule2 B,rule2 D,rule1 B,rule3 现在我想知道A,B共享了多少第二列值(以及A,C和A,D。但是A,B作为一个解释足以实现其余的)。我所做的是: file1 = open('file.csv', 'rU') fileR = csv.reader(file1, delimiter=',') counter = 0 for i in range(0, 5): #list that contain

我有以下csv文件:

A,rule1
B,rule1
C,rule2
A,rule2
B,rule2
D,rule1
B,rule3
现在我想知道A,B共享了多少第二列值(以及A,C和A,D。但是A,B作为一个解释足以实现其余的)。我所做的是:

file1 = open('file.csv', 'rU')
fileR = csv.reader(file1, delimiter=',')

counter = 0

for i in range(0, 5): #list that contains A, B, C. i.e list = [A, B, C, D, E, F]
 for j in range(0, 5): 
  for k in range(0, 8): # rule list rlist = [rule1, rule2, ...]
   for rows in fileR:
    if rows[0] == list[i] and rows[1] == rlist[k]:
     if rows[0] == list[j] and rows[1] == rlist[k]:
       counter += 1

print counter
这里,
计数器
表示A、B(以及A、C等)共享的总规则。但我没有得到正确的答案。因此,答案应该是A和B=2,因为A和B都有规则1和规则2。我做得对吗?

很简单

1,将第二个字段值转换为
set
s(使用集合理解)

2、使用
set
intersection
方法来获取共享的

3,并获取结果集的
len

file1 = open('file.csv', 'rU')
fileR = csv.reader(file1, delimiter=',')
L=list(fileR)
print set(item[1] for item in L if item[0]=='A').intersection([item[1] for item in L if item[0]=='B'])
print len(set(item[1] for item in L if item[0]=='A').intersection([item[1] for item in L if item[0]=='B']))

#set(['rule2', 'rule1'])
#2

这可以通过Python的
set
s和
itertools
模块轻松解决。如果您使用
set
s,您可以轻松地计算交叉点,
itertools
可以轻松地生成组合。不要这样做,而是使用一个键为a的defaultdict,您的列表元素和值就是规则。然后查找a和b的交集gets total Rules I将创建一个由第一列元素索引的字典,其中的值是与该键关联的值集。要回答您的问题,您只需计算集合交集的大小。在“rU”模式下打开csv文件可能会导致问题。如中所述:如果
csvfile
是一个文件对象,则必须在有区别的平台上使用“b”标志打开它。只要从OP复制并粘贴即可,前提是OP中有充分的理由这样做。这很公平。不过,我通常会假设相反的情况,并提到这个问题,以防它实际上是一个错误。