Python 是否有可能更高效、更快地解析此词典列表?

Python 是否有可能更高效、更快地解析此词典列表?,python,performance,dictionary,parsing,list-comprehension,Python,Performance,Dictionary,Parsing,List Comprehension,我有一个充满字典和列表的列表,这些字典和列表具有源自xml文件的深层层次结构。我想解析它,并以最高效、最快的方式将其转换为新的格式,因为我要处理大量的数据。我想这对你们来说会很有趣的 到目前为止,我的代码正在运行。由此可以得出原始列表中相关信息的位置。我不会在这里显示原始列表,因为它太大和模糊。但是,如果您需要,我可以添加这些信息 analysis = [] for sentence in mylist: for i, word in enumerate(sentence['w']):

我有一个充满字典和列表的列表,这些字典和列表具有源自xml文件的深层层次结构。我想解析它,并以最高效、最快的方式将其转换为新的格式,因为我要处理大量的数据。我想这对你们来说会很有趣的

到目前为止,我的代码正在运行。由此可以得出原始列表中相关信息的位置。我不会在这里显示原始列表,因为它太大和模糊。但是,如果您需要,我可以添加这些信息

analysis = []
for sentence in mylist:
    for i, word in enumerate(sentence['w']):
        tmp_dic = {}
        index = i+1
        tmp_dic['index'] = str(index)
        tmp_dic['text'] = word['t']
        tmp_dic['lemma'] = word['lemma']['@class']
        morph = ''
        if len(word['morphology']['morpheme']) > 1:
            for morphem in word['morphology']['morpheme']:
                morph += '[' + morphem['t'] + ']'
        else:
            morph += '[' + word['morphology']['morpheme']['t'] + ']'
        tmp_dic['morph'] = morph
        tmp_dic['pos'] = word['pos']['@class']
        tmp_dic['posprob'] = word['pos']['@confidence']
        if index == len(sentence['w']):
            tmp_dic['eos'] = True      
        analysis.append(tmp_dic)
我想这个代码是不言自明的。然而,我想知道是否存在更优雅,尤其是更快的代码,例如使用列表理解。如果您需要更多信息,请随时询问!最终结果应如下所示:

>>>print(analysis)
[{'index': '1', 'text': 'zo', 'lemma': 'zo', 'morph': '[zo]', 'pos': 'BW()', 'posprob': '0.999512'}, {'index': '2', 'text': 'schrijft', 'lemma': 'schrijven', 'morph': '[schrijf][t]', 'pos': 'WW(pv,tgw,met-t)', 'posprob': '0.998984'}, {'index': '3', 'text': 'paulus', 'lemma': 'paulus', 'morph': '[paulus]', 'pos': 'ADJ(vrij,basis,zonder)', 'posprob': '0.382880'}, {'index': '4', 'text': 'in', 'lemma': 'in', 'morph': '[in]', 'pos': 'VZ(init)', 'posprob': '0.999350'}, {'index': '5', 'text': 'de', 'lemma': 'de', 'morph': '[de]', 'pos': 'LID(bep,stan,rest)', 'posprob': '0.999964'}, {'index': '6', 'text': 'brief', 'lemma': 'brief', 'morph': '[brief]', 'pos': 'N(soort,ev,basis,zijd,stan)', 'posprob': '0.999172'}, {'index': '7', 'text': 'aan', 'lemma': 'aan', 'morph': '[aan]', 'pos': 'VZ(init)', 'posprob': '0.999180'}, {'index': '8', 'text': 'de', 'lemma': 'de', 'morph': '[de]', 'pos': 'LID(bep,stan,rest)', 'posprob': '0.999964'}, {'index': '9', 'text': 'gemeente', 'lemma': 'gemeente', 'morph': '[gemeente]', 'pos': 'N(soort,ev,basis,zijd,stan)', 'posprob': '0.999756'}, {'index': '10', 'text': 'in', 'lemma': 'in', 'morph': '[in]', 'pos': 'VZ(init)', 'posprob': '0.931125'}, {'index': '11', 'text': 'filippi', 'lemma': 'filippi', 'morph': '[filippi]', 'pos': 'N(soort,ev,basis,onz,stan)', 'posprob': '0.508322', 'eos': True}, {'index': '1', 'text': 'zij', 'lemma': 'zij', 'morph': '[zij]', 'pos': 'VNW(pers,pron,nomin,vol,3p,mv)', 'posprob': '0.934959'}, {'index': '2', 'text': 'verzetten', 'lemma': 'verzetten', 'morph': '[ver][zet][en]', 'pos': 'WW(pv,tgw,mv)', 'posprob': '0.909747'}, {'index': '3', 'text': 'zich', 'lemma': 'zich', 'morph': '[zich]', 'pos': 'VNW(refl,pron,obl,red,3,getal)', 'posprob': '0.999740'}, {'index': '4', 'text': 'met', 'lemma': 'met', 'morph': '[met]', 'pos': 'VZ(init)', 'posprob': '0.999480'}, {'index': '5', 'text': 'hem', 'lemma': 'hem', 'morph': '[hem]', 'pos': 'VNW(pers,pron,obl,vol,3,ev,masc)', 'posprob': '0.992108'}, {'index': '6', 'text': 'tegen', 'lemma': 'tegen', 'morph': '[tegen]', 'pos': 'VZ(init)', 'posprob': '0.997583'}, {'index': '7', 'text': 'de', 'lemma': 'de', 'morph': '[de]', 'pos': 'LID(bep,stan,rest)', 'posprob': '0.999964'}, {'index': '8', 'text': 'theologie', 'lemma': 'theologie', 'morph': '[theologisch][ie]', 'pos': 'N(soort,ev,basis,zijd,stan)', 'posprob': '0.997691', 'eos': True}]

请不要试图把这变成一个列表理解,这将使它不必要的复杂

相反,您可以做一些小的改进,例如使用值实例化
tmp\u dic
,而不是在事实之后分配键,从1开始枚举,而不是单独设置索引,以及使用f字符串来构建
morph
,而不是附加字符串

analysis = []
for sentence in mylist:
    for i, word in enumerate(sentence['w'], 1):
        tmp_dic = {
            'index': str(i),
            'text': word['t'],
            'lemma': word['lemma']['@class'],
            'pos': word['pos']['@class'],
            'posprob': word['pos']['@confidence'],
            'morph': "[{inner_morph}]".format(
                inner_morph="][".join(morphem["t"] for morphem in word['morphology']['morpheme'])
             )
        }

        if i == len(sentence['w']):
            tmp_dic['eos'] = True      
        analysis.append(tmp_dic)

如果您使用
lambda
@chepner
analysis
可能会更短。这是我在第一行定义的列表,稍后用于存储解析结果。抱歉,我误读了这一点,尽管
analysis
是您正在解析的字符串。我的实现需要:0.0063毫秒。这个需要:0.00299毫秒。(在非常小的数据集上测试)很好!我也很喜欢它如何摆脱我的索引=1+I的东西implementation@hyhno01-这很好,如果
语素
包含多个元素,那么它只是一个列表,对吗?如果它总是一个列表,那么可以删除if语句,如果
eos
的值为false,则可以删除最后一个if语句。不幸的是,
morpheme
始终是列表。是的,我的eos值可以是
False
。然而,我决定反对它,因为它的输出更像是我第一次使用的另一个程序的输出analysis@hyhno01-我已更新以删除
语素
if语句,该语句也应该有帮助,如果它引入错误,我将回滚,因为如果它是列表,您的else语句将不起作用