我有一本名为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']]
我在代码中看到的一个问题是
index
的使用:index
返回字符第一次出现的索引。因此,如果您的字符串中有两个(
,那么这两次都会给出第一个的索引。这(以及你的break
语句)就是为什么在你的例子中你得到了正确的['2.1', '2.2', '2.3']
,但也得到了'(#5.1', '5.2', '5.3)'
。你知道吗您可以通过为
index
方法指定一个起始索引来解决这个问题,但我建议使用另一种策略。如果解析的字符串中没有逗号,可以使用相当简单的正则表达式来查找所有组:这将找到括号内的所有内容,以及不包含逗号的所有内容。例如:
这样,您就可以将所有内容适当地分组。您仍然需要对每个条目进行一点处理,但应该相当简单。你知道吗
在处理过程中,
startswith
方法应该很有用。例如:这将使您很容易区分
(...)
和(#...)
。如果(...)
中有逗号,则在使用regex之后,可以始终使用逗号分隔。你知道吗相关问题 更多 >
编程相关推荐