【发布时间】:2014-05-12 16:18:37
【问题描述】:
我有一本名为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', '2']]被拆分成[['1'], ['2']]而[['2.1', '2.2', '2.3']]没有被拆分? -
这只是一个例子,真正的代码实际上并没有采取显示的数字。一个真实的例子是:#982 : [[IFCPROPERTYSET],["'2ox2xoAH983wkyoGwQ_TXa',#41,'Structural',$,(#769,#761,#269,#770,#274,#272,#275 ,#981))"]
-
如果您的示例代码与真实代码的属性不同,我们如何帮助创建解决方案?使一个列表元素拆分而另一个不拆分的标准是什么?
-
我将其编辑为更易于阅读字典。我将编辑我的帖子以更客观。
-
你会有带逗号的字符串吗?例如
["'has,commas,','other_stuff']
标签: python list dictionary split find