我知道这是一个基本问题,但我是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'
,
如果没有找到方法,我就不知道如何做到这一点。
答案 0 :(得分:4)
如果您想知道某个值是否在列表中,您可以使用in
,如下所示:
>>> my_list = ["one", "two", "three"]
>>> "two" in my_list
True
>>>
如果您需要获取列表中值的位置,则必须使用index
:
>>> my_list.index("two")
1
>>>
请注意,列表的第一个元素具有0索引。
答案 1 :(得分:1)
你走了:
>>> 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'\((.*)\)'
在(
和)
中查找元素并将其转换为列表。它使子字符串在括号之前显示为键,列表显示为值。
答案 2 :(得分:1)
您可以使用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'
首先没有显示。