Python:具有最常见条目的数据子集

4
我正在努力解决以下问题。 想象一下,我有很多像这样的数据:
one = {'A':'m','B':'n','C':'o'}
two = {'A':'m','B':'n','C':'p'}
three = {'A':'x','B':'n','C':'p'}

“等等”,这些不一定需要被存储在字典中。我该如何获取包含最常见条目的数据子集?
在上面的例子中,我想要获取:
one, two          with same A and B = m,n
two, three        with same B and C = n,p
one, two three    with same B       = n
one, two          with same A       = m
2个回答

2
一种但不是很高效的处理长字典的方法是使用itertools.combinations来查找字典之间的组合,然后在组合和集合之间循环,并获取集合项之间的交集。
one = {'one':{'A':'m','B':'n','C':'o'}}
two ={'two':{'A':'m','B':'n','C':'p'}}
three = {'three':{'A':'x','B':'n','C':'p'}}

dict_list=[one,two,three]
v_item=[i.items() for i in dict_list]

from itertools import combinations
names=[]
items=[]
l=[combinations(v_item,i) for i in range(2,4)]
flat=[[[t[0] for t in k] for k in j] for j in l]  
"""this line is for flattening the combinations i don't know why but python puts every elements within a list :
>>> l
[[([('one', {'A': 'm', 'C': 'o', 'B': 'n'})], [('two', {'A': 'm', 'C': 'p', 'B': 'n'})]), 
([('one', {'A': 'm', 'C': 'o', 'B': 'n'})], [('three', {'A': 'x', 'C': 'p', 'B': 'n'})]), 
([('two', {'A': 'm', 'C': 'p', 'B': 'n'})], [('three', {'A': 'x', 'C': 'p', 'B': 'n'})])], 
[([('one', {'A': 'm', 'C': 'o', 'B': 'n'})], [('two', {'A': 'm', 'C': 'p', 'B': 'n'})], [('three', {'A': 'x', 'C': 'p', 'B': 'n'})])]]"""


for comb in flat :
   for pair in comb:
     names,items =zip(*pair)
     items=[i.viewitems() for i in items]
     print names,reduce(lambda x,y:x&y,items) 

结果:
('one', 'two') set([('B', 'n'), ('A', 'm')])
('one', 'three') set([('B', 'n')])
('two', 'three') set([('B', 'n'), ('C', 'p')])
('one', 'two', 'three') set([('B', 'n')])

关于下面的这几行:
     items=[i.viewitems() for i in items]
     print names,reduce(lambda x,y:x&y,items)

你需要创建一个以set对象作为处理对象的视图对象,然后就可以使用&运算符计算项目的交集。使用reduce函数。

哎呀,你说得对,处理大数据集的速度真是太慢了,而且还会出现内存不足的问题 :O :/ - Sven Lange

0

谢谢Kasra,这给了我最后的提示 :).
我改了一些东西并将其转换为Python3(忘记提到了...)。
但是像你的代码一样,它在大型数据集上非常慢且内存不足(我确实有这种情况)。所以我必须寻找另一种方法 :/.

这是我的最终代码:

from itertools import combinations
from functools import reduce

class Piece():
    def __init__(self,tag,A,B,C):
        self._tag = tag
        self.A = A
        self.B = B
        self.C = C

        self._dict = set(self.__dict__.items())  


pieces = []
pieces.append(Piece('one','m','n','o'))
pieces.append(Piece('two','m','n','p'))
pieces.append(Piece('three','x','n','p'))


l=[combinations(pieces,i) for i in range(2,4)]
flat =[]
for i in l:
    for k in i:
        flat.append(k)


for f in flat:
    print('-'*25)    
    print([j._tag for j in f])
    dicts = (i._dict for i in f)    
    matches = reduce(lambda x,y : x & y,dicts)    
    print(matches)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接