+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2020-10-22 19:57     阅读(401)     评论(0)     点赞(21)     收藏(4)


0

1

2

3

4

5

6

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

解决方案


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

这将使您轻松区分(...)(#...)如果中有逗号,(...)则使用正则表达式后,您始终可以使用逗号分割。

0

1

2

3

4

5

6

7



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/607362/99711be11e152dde92c2/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)