如何及时计算非常大的字符串矩阵的所有可能性?

时间:2016-09-05 12:09:20

标签: python-2.7 numpy matrix

好吧让我说我的情况是我有一堆不同分类的对象,我需要知道这些对象的总体可能组合,所以我最终得到一个看起来像这样的输入

{'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图书馆可以帮助我,但我是科学编程的新手,不知道如何去做,或者是否值得,是否有人可以提供一些见解?谢谢。

1 个答案:

答案 0 :(得分:0)

试试这个:

  1. 删除重复的值
  2. 使用排列和因子计算所有可能性
  3. 喜欢那样: https://www.youtube.com/watch?v=Oc50d2GqXx0