使用“拆分并查找”编辑列表的内容

2024-09-27 00:22:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本名为dicitionario1的字典。我需要将dicionario[chave][1]的内容替换为列表lista_atributoslista_atribtutos使用dicionario[chave][1]的内容获取列表,其中:

  • 除了找到字符"(#"")"之外,所有信息都用","分隔。在这种情况下,它应该创建一个包含这些字符之间内容的列表(也用","分隔)。它可以找到'(#'的一个或多个条目,我需要处理其中的每一个条目。你知道吗

尽管这可能很简单,但我还是坚持使用以下代码:

dicionario1 = {'#998' : [['IFCPROPERTYSET'],["'0siSrBpkjDAOVD99BESZyg',#41,'Geometric Position',$,(#977,#762,#768,#754,#753,#980,#755,#759,#757)"]],
               '#1000' : [['IFCRELDEFINESBYPROPERTIES'],["'1dEWu40Ab8zuK7fuATUuvp',#41,$,$,(#973,#951),#998"]]}



for chave in dicionario1:
    lista_atributos = []
    ini = 0
    for i in dicionario1[chave][1][0][ini:]:
        if i == '(' and dicionario1[chave][1][0][dicionario1[chave][1][0].index(i) + 1] == '#':
            ini = dicionario1[chave][1][0].index(i) + 1
            fim = dicionario1[chave][1][0].index(')')  
            lista_atributos.append(dicionario1[chave][1][0][:ini-2].split(','))
            lista_atributos.append(dicionario1[chave][1][0][ini:fim].split(','))
            lista_atributos.append(dicionario1[chave][1][0][fim+2:].split(','))

            print lista_atributos

结果:

[["'1dEWu40Ab8zuK7fuATUuvp'", '#41', '$', '$'], ['#973', '#951'], ['#998']]
[["'0siSrBpkjDAOVD99BESZyg'", '#41', "'Geometric Position'", '$'], ['#977', '#762', '#768', '#754', '#753', '#980', '#755', '#759', '#757'], ['']]

不幸的是,我知道如何迭代dictionario1[chave][1][0]以获得以下结果:

[["'1dEWu40Ab8zuK7fuATUuvp'"], ['#41'], ['$'], ['$'], ['#973', '#951'], ['#998']]
[["'0siSrBpkjDAOVD99BESZyg'", ['#41'], ["'Geometric Position'"], ['$'], ['#977', '#762', '#768', '#754', '#753', '#980', '#755', '#759', '#757']]

我需要结果中的"["'1dEWu40Ab8zuK7fuATUuvp'", '#41', '$', '$']...",也要变成["'1dEWu40Ab8zuK7fuATUuvp'"], ['#41'], ['$'], ['$']...

同样,如果我将"Geometric Position"修改为"(Geometric Position)",结果会变成:

[["'1dEWu40Ab8zuK7fuATUuvp'", '#41', '$', '$'], ['#973', '#951'], ['#998']]

解决方案:(感谢Rob Watts)

import re

dicionario1 =["'0siSrBpkjDAOVD99BESZyg',#41,'(Geometric) (Position)',$,(#977,#762,#768,#754,#753,#980,#755,#759,#757)"]

dicionario1 =  re.findall('\([^)]*\)|[^,]+', dicionario1[0])

for i in range(len(dicionario1)):
    if dicionario1[i].startswith('(#'):
        dicionario1[i] = dicionario1[i][1:-1].split(',')
    else:
        pass

print dicionario1

["'0siSrBpkjDAOVD99BESZyg'", '#41', "'(Geometric) (Position)'", '$', ['#977', '#762', '#768', '#754', '#753', '#980', '#755', '#759', '#757']]

Tags: in内容列表forindexpositioninisplit
1条回答
网友
1楼 · 发布于 2024-09-27 00:22:44

我在代码中看到的一个问题是index的使用:

ini = dicionario1[chave][1][0].index(i) + 2
fim = dicionario1[chave][1][0].index(')')

index返回字符第一次出现的索引。因此,如果您的字符串中有两个(,那么这两次都会给出第一个的索引。这(以及你的break语句)就是为什么在你的例子中你得到了正确的['2.1', '2.2', '2.3'],但也得到了'(#5.1', '5.2', '5.3)'。你知道吗

您可以通过为index方法指定一个起始索引来解决这个问题,但我建议使用另一种策略。如果解析的字符串中没有逗号,可以使用相当简单的正则表达式来查找所有组:

'\([^)]*\)|[^,]+'

这将找到括号内的所有内容,以及不包含逗号的所有内容。例如:

>>> import re
>>> teststr = "'1',$,#41,(#10,#5)"
>>> re.findall('\([^)]*\)|[^,]+', teststr)
["'1'", '$', '#41', '(#10,#5)']

这样,您就可以将所有内容适当地分组。您仍然需要对每个条目进行一点处理,但应该相当简单。你知道吗

在处理过程中,startswith方法应该很有用。例如:

>>> '(something)'.startswith('(')
True
>>> '(something)'.startswith('(#')
False
>>> '(#1,#2,#3)'.startswith('(#')
True

这将使您很容易区分(...)(#...)。如果(...)中有逗号,则在使用regex之后,可以始终使用逗号分隔。你知道吗

相关问题 更多 >

    热门问题