好吧让我说我的情况是我有一堆不同分类的对象,我需要知道这些对象的总体可能组合,所以我最终得到一个看起来像这样的输入
{'raw':[{'AH':['P','C','R','Q','L']},
{'BG':['M','A','S','B','F']},
{'KH':['E','V','G','N','Y']},
{'KH':['E','V','G','N','Y']},
{'NM':['1','2','3','4','5']}]}
如果密钥AH,BG,KH,NM构成组,则值是包含单个对象的列表,并且完成的组将构成每个列表的一个成员,在此示例中,KH被列出两次,因此每个完成的组将具有2 KH的成员。我构建了一个处理它的东西,它看起来像这样。
class Builder():
def __init__(self, data):
self.raw = data['raw']
node = []
for item in self.raw:
for k in item.keys():
node.append({k:0})
logger.debug('node: %s' % node)
#Parse out groups#
self.groups = []
increment = -2
while True:
try:
assert self.raw[increment].values()[0][node[increment][node[increment].keys()[0]]]
increment = -2
for x in self.raw[-1].values()[0]:
group = []
for k in range(0,len(node[:-1])):
position = node[k].keys()[0]
player = self.raw[k].values()[0][node[k][node[k].keys()[0]]]
group.append({position:player})
group.append({self.raw[-1].keys()[0]:x})
if self.repeatRemovals(group):
self.groups.append(group)
node[increment][node[increment].keys()[0]]+=1
except IndexError:
node[increment][node[increment].keys()[0]] = 0
increment-=1
try:
node[increment][node[increment].keys()[0]]+=1
except IndexError:
break
for group in self.groups:
logger.debug(group)
def repeatRemovals(self, group):
for x in range(0, len(group)):
for y in range(0, len(group)):
if group[x].values()[0] == group[y].values()[0] and x != y:
return False
return True
if __name__ == '__main__':
groups = Builder({'raw':[{'AH':['P','C','R','Q','L']},
{'BG':['M','A','S','B','F']},
{'KH':['E','V','G','N','Y']},
{'KH':['E','V','G','N','Y']},
{'NM':['1','2','3','4','5']}]})
logger.debug("Total groups: %d" % len(groups.groups))
如果我没有在文本中这样做,那么运行它的输出应该清楚地说明我的预期目标。我关心的是处理对象的大型分类所花费的时间,当分类中有大约40个对象时,它在矩阵中有三次,还有7个其他分类具有可比较的对象大小。我认为numpy图书馆可以帮助我,但我是科学编程的新手,不知道如何去做,或者是否值得,是否有人可以提供一些见解?谢谢。
答案 0 :(得分:0)
试试这个: