【问题标题】:Edit content of a list with split and find使用拆分和查找编辑列表的内容
【发布时间】:2014-05-12 16:18:37
【问题描述】:

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

【问题讨论】:

  • 为什么[['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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的帮助。问题是我只想用'(# ... )'而不是'( ... )'修改条目。
  • @JoaoSa 我添加了一些关于如何区分它们的信息。
  • 非常感谢,我会试一试。还是今天,我会给你一些反馈。我对 Python 的了解非常基础,但我正在尝试用它来构建我的论文。再次感谢您。
猜你喜欢
  • 2018-04-15
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 2021-10-07
  • 2015-06-18
相关资源
最近更新 更多