【问题标题】:'list' object has no attribute 'find''list' 对象没有属性 'find'
【发布时间】:2014-06-05 18:01:38
【问题描述】:

我知道这是一个基本问题,但我是 python 新手,不知道如何解决它。

我有一个类似下一个示例的列表:

entities = ["#1= IFCORGANIZATION($,'Autodesk Revit 2014 (ENU)',$,$,$)";, "#5= IFCAPPLICATION(#1,'2014','Autodesk Revit 2014 (ENU)','Revit');"]

我的问题是如何将列表"entities"中的信息按以下格式添加到字典中:

dic = {'#1= IFCORGANIZATION' : ['$','Autodesk Revit 2014 (ENU)','$','$','$'], '#5= IFCAPPLICATION' : ['#1','2014','Autodesk Revit 2014 (ENU)','Revit']

我尝试使用"find" 执行此操作,但出现以下错误: 'list' object has no attribute 'find',

如果没有 find 方法,我不知道该怎么做。

【问题讨论】:

  • 你的意思是'$'而不是$
  • 好吧,列表没有 find() 方法。不过,他们确实有一个 index() 方法。
  • zhangxaochen:没错。我很抱歉我的错误。谢谢。

标签: python string list dictionary find


【解决方案1】:

如果您想知道某个值是否在列表中,您可以使用in,如下所示:

>>> my_list = ["one", "two", "three"]
>>> "two" in my_list
True
>>> 

如果需要获取值在列表中的位置,必须使用index

>>> my_list.index("two")
1
>>> 

请注意,列表的第一个元素的索引为 0。

【讨论】:

  • Trimax:感谢您的支持。问题是列表中的数据总是不同的,因此我无法搜索特定的单词。我需要将列表中的每个字符串按照前面介绍的格式进行划分,以便我可以操作信息然后使用它。
  • 对于字符串中的搜索模式更有用的是正则表达式模块redocs.python.org/3.3/library/re.html,您可以在列表中按组提取它们。
  • @Trimax 你的权利,但列表理解会更合适。如果 so 不知道如何遍历列表,您认为 re 可以吗?
  • 使用 re.findall() 你会得到一个包含字符串中所有数学的列表,并且你的输入似乎有一个模式,列表中的数据总是不同的,但它不是随机的。
  • @Trimax 在我的特殊情况下,我不介意字典的顺序是否不正确。但如果我需要,我会使用你的建议。谢谢。
【解决方案2】:

您可以使用str.split 来处理字符串。先用'('分割每个元素字符串,maxsplit为1:

In [48]: dic=dict(e[:-1].split('(', 1) for e in entities) #using [:-1] to filter out ')'
    ...: print dic
    ...: 
{'#5= IFCAPPLICATION': "#1,'2014','Autodesk Revit 2014 (ENU)','Revit')", '#1= IFCORGANIZATION': "$,'Autodesk Revit 2014 (ENU)',$,$,$)"}

然后用','分割字典中的每个值:

In [55]: dic={k: dic[k][:-1].split(',') for k in dic}
    ...: print dic
{'#5= IFCAPPLICATION': ['#1', "'2014'", "'Autodesk Revit 2014 (ENU)'", "'Revit'"], '#1= IFCORGANIZATION': ['$', "'Autodesk Revit 2014 (ENU)'", '$', '$', '$']}

请注意,dict 中的键值对是无序的,您可能会看到'#1= IFCORGANIZATION' 一开始就没有显示。

【讨论】:

  • zhangxaochen:非常感谢您的支持。我尝试了您的代码,它确实满足了我的需求。我不需要字典按特定顺序排列,所以这不是问题。也谢谢你的解释。问候!
【解决方案3】:

给你:

>>> import re
>>> import ast
>>> entities = ["#1= IFCORGANIZATION('$','Autodesk Revit 2014 (ENU)','$','$','$');", "#5= IFCAPPLICATION('#1','2014','Autodesk Revit 2014 (ENU)','Revit');"]
>>> entities = [a.strip(';') for a in entities]
>>> pattern = re.compile(r'\((.*)\)')
>>> dic = {}
>>> for a in entities:
...     s = re.search(pattern, a)
...     dic[a[:a.index(s.group(0))]] = list(ast.literal_eval(s.group(0)))
>>> dic
{'#5= IFCAPPLICATION': ['#1', '2014', 'Autodesk Revit 2014 (ENU)', 'Revit'], '#1= IFCORGANIZATION': ['$', 'Autodesk Revit 2014 (ENU)', '$', '$', '$']}

这个正则表达式r'\((.*)\)'() 中查找元素并将它们转换为一个列表。它使出现在括号之前的子字符串作为键,列表作为值。

【讨论】:

  • shaktimaan:感谢您的快速支持。我不知道这些模块,所以感谢您向我介绍它们。我没有设法让你的代码工作,因为在我的“实体”变量中,我没有'和 $,即'$'。但我认为通过一些调整它会很好!问候。
  • 如果没有引号,将它们存储为列表会有点复杂
  • @shaktimaan:zhangxaochen 的答案没有使用任何模块,但效果很好!谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-02-05
  • 2021-01-05
  • 1970-01-01
  • 2020-08-09
  • 2019-03-19
  • 2021-01-04
  • 2021-07-26
  • 2019-04-29
相关资源
最近更新 更多