使用拆分和查找编辑列表的内容

时间:2014-05-12 16:18:38

标签: python list dictionary split find

我有一个名为dicitionario1的字典。我需要替换列表dicionario[chave][1]的列表lista_atributos的内容。 lista_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']]

1 个答案:

答案 0 :(得分:0)

我在您的代码中看到的一个问题是使用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

这样您就可以轻松区分(...)(#...)。如果(...)中有逗号,则在您使用正则表达式后,您可以随时使用逗号分隔。