首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用拆分和查找编辑列表的内容

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

Stack Overflow用户
提问于 2014-05-12 16:18:37
回答 1查看 50关注 0票数 1

我有一本叫dicitionario1的字典。我需要替换dicionario[chave][1]的内容,它是一个列表,用于列表lista_atributoslista_atribtutos使用dicionario[chave][1]的内容获取列表,其中:

  • 除发现字符"(#"")"外,所有信息都由"(#"进行区分。在这种情况下,它应该创建一个列表,其中包含这些字符之间的内容(也由","分隔)。它可以找到“(#”)的一个或多个条目,我需要处理其中的每一个条目。

虽然这可能很简单,但我仍然坚持使用以下代码:

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
[["'1dEWu40Ab8zuK7fuATUuvp'", '#41', '$', '$'], ['#973', '#951'], ['#998']]
[["'0siSrBpkjDAOVD99BESZyg'", '#41', "'Geometric Position'", '$'], ['#977', '#762', '#768', '#754', '#753', '#980', '#755', '#759', '#757'], ['']]

不幸的是,我可以弄清楚如何在dictionario1[chave][1][0]上迭代以获得这个结果:

代码语言:javascript
复制
[["'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)",结果如下:

代码语言:javascript
复制
[["'1dEWu40Ab8zuK7fuATUuvp'", '#41', '$', '$'], ['#973', '#951'], ['#998']]

解决方案:(多亏了罗布·瓦茨)

代码语言:javascript
复制
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']]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-12 17:01:53

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

代码语言:javascript
复制
ini = dicionario1[chave][1][0].index(i) + 2
fim = dicionario1[chave][1][0].index(')')

index返回字符第一次出现的索引。因此,如果字符串中有两个(,那么两次都会给出第一个字符串的索引,这就是为什么在您的示例中正确地获得了['2.1', '2.2', '2.3'],但也有'(#5.1', '5.2', '5.3)'

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

代码语言:javascript
复制
'\([^)]*\)|[^,]+'

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

代码语言:javascript
复制
>>> import re
>>> teststr = "'1',$,#41,(#10,#5)"
>>> re.findall('\([^)]*\)|[^,]+', teststr)
["'1'", '$', '#41', '(#10,#5)']

这样,您就可以将所有的东西适当地分组。您仍然需要对每个条目进行一些处理,但这应该相当简单。

在处理过程中,startswith方法应该是有帮助的。例如:

代码语言:javascript
复制
>>> '(something)'.startswith('(')
True
>>> '(something)'.startswith('(#')
False
>>> '(#1,#2,#3)'.startswith('(#')
True

这将使您很容易区分(...)(#...)。如果(...)中有逗号,那么在使用regex之后,始终可以在逗号上拆分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23614042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档