如何在python

时间:2019-04-28 23:04:17

标签: python

我有一个要排序的句子列表,以便每个后续句子一次只引入一个新词(在先前的句子中未见过)。我的程序可以运行-但是一旦我开始输入适当大小的列表,它就会花很多时间。对于没有经过CS培训并且没有作为程序员的基本经验的人,我该如何使其更快?

我已经搜索了这个问题,并阅读了有关多处理和向量方法的信息。最初,多处理似乎无济于事,因为我仍然需要将每个元素相互比较,所以没关系。 (是错误的吗?如果是这样,我如何才能开始实施这种方法?)Vector帖子超出了我的最初理解。

import operator as op 
def ranker(inputList):
    """
    to sort sentences to introduce only one new word at a time
    """

    knownItems = list()
    knownPieces = list()
    temporaryList = list()

    #grab only the section of the inputList that i want to work with
    for x in inputList:
        temporaryList.append(x[0])

    #loop until the whole inputList has been covered
    while(len(temporaryList) >= 1):
        #print(len(temporaryList))
        localStorageDict = {}
        for x in temporaryList:
            wordStorageArray = x.split() 
            counter = 0 
            for word in wordStorageArray:

                if word not in knownPieces:
                    counter += 1
            localStorageDict[x] = counter


        sortedList = sorted(localStorageDict.items(), key=op.itemgetter(1))
        localStorageDict.clear()
        newKnownItem = sortedList[0][0]
        knownItems.append(newKnownItem)
        newKnownPieceArray = newKnownItem.split()
        for word in newKnownPieceArray:
            if word not in knownPieces:
                knownPieces.append(word)

        temporaryList.remove(newKnownItem)

    print(temporaryList)
    return knownItems


sampleList = [('यह बहुत है।', 0), ('यह एक महानदी है।', 6.738544474393532e-05), ('यह मुमकिन है।', 6.738544474393532e-05), ('यह तस्करों का अड्डा है।', 0.00026954177897574127), ('मिशन कामयाब रहा', 0.00097574127), ('ज़ोकर बहुत बौना था', 0.00026954177897574127), ('यह एक टेढ़ा विचार था', 0.00026954177897574127), ('यह निराली हरकत थी।', 0.00026954177897574127), ('पर्यटक टूर पर था।', 0.000269897574127), ('पहिया ढीला था।', 0.00026954177897574127), ('प्रदर्शनी हाउसफुल थी।', 0.00026954177897574127), ('वह फुरसत में खेलेंगे।', 0.00026954177897574127), ('मेट्रो भूमिगत है।', 0.000227), ('कढ़ी में बहुत मसाला था।', 0.00026954177897574127), ('मीनार बहुत ऊँची थी।', 0.00026954177897574127), ('यह एक रेतीला तुफान था।', 0.00026954177897574127), ('यह एक कोरा चेक है', 0.000636119), ('इस उत्पाद में एक खराबी है', 0.0004043126684636119), ('यह एक खोटा सिक्का है', 0.0004043126684636119), ('चरवाहा बहुत चालाक था', 0.0004043126684636119), ('छत पर एक कौआ था', 0.000684636119), ('झाड़ी में एक झींगुर था', 0.000404312668463)]

ranker(sampleList)

1 个答案:

答案 0 :(得分:0)

sortedList = sorted(localStorageDict.items(),
                    key=op.itemgetter(1))
if word not in knownPieces:

乍一看,似乎您正在对列表进行排序,并扫描另一个列表以在每次迭代时检查项目的存在。

对于排序,您可以考虑使用树数据结构,因为它只需要在增加计数器时向上移动树的分支,而不是在每次迭代时对整个列表进行排序。

对于项目检查,请考虑使用set()。它就像一个字典,但是没有关联的值,并且无论集合中有多少个项目,检查项目是否都在集合中(大约)需要相同的时间。实际上,集合if x not in my_list: my_list.append(x)的行为与简单地写my_set.add(x)的行为相同,因此可以大大简化操作:如果项目已经在集合中,则它是无操作的。但是,该集不会保留您的插入顺序,因此,如果出现问题,您可以改用字典,而只需将值设置为占位符,例如True。我从alec_a用户那里了解到,只要您不从字典中删除键,Python 3.7规范就可以保证插入顺序得以保留。

您还可以考虑使用Counter模块中的collections。这是一个字典子类,可将值初始化为0并实现更多的操作,例如加法和减法:

>>> Counter(['hello', 'world']) + Counter(['goodbye', 'cruel', 'world')
Counter({'hello': 1, 'world': 2, 'goodbye': 1, 'cruel': 1})

>>> Counter(['hello', 'world']) - Counter(['goodbye', 'cruel', 'world'])                   
Counter({'hello': 1})