2017-07-17 56 views
1

我有下面的代码,并希望返回的主题,对于任何给定的老师的最有效的方法:与由分隔符分隔的两个值的列表,访问在第二列第二场

注:列表alldata包含格式的数据:

['Mr Moose : Maths', 'Mr Goose: History', 'Mrs Marvin: Computing'] 

其中'Mr Moose:Maths'是列表中的第一个元素。 我希望得到的数学和历史和计算,对于搜索对于任何给定的老师。

代码

#Search for a teacher, and return the subject they teach 
"""File contents 
Mr Moose : Maths 
Mr Goose: History 
Mrs Cook: English 

""" 

alldata=[] 
col_num=0 
teacher_names=[] 
delimiter=":" 

def main(): 
     with open("teacherbook.txt") as f: 
      for line in f.readlines(): 
        alldata.append((line.strip())) 
      print(alldata) 


      print() 
      print() 

      for x in alldata: 
        teacher_names.append(x.split(delimiter)[col_num].strip()) 


      teacher=input("Enter teacher you are looking for:") 
      if teacher in teacher_names: 
        print("..and the subject they teach is:",teacher_names[2]) 
      else: 
        print("No") 

main() 

我很想知道,如果这个代码可以只通过增加一个简单的线条来在那里我有teacher_names [2]和/或任何解决方案,更优雅固定,即显示了如何直接搜索一个文件给定的名称(如驼鹿先生)并返回下一个场(在这种情况下,数学)。这里的过程看起来很艰难,而不是使用csv处理的过程。

+3

是列表中唯一的每个元素的第一个元素?如果是这样,为什么不把它们解析成字典呢? – MooingRawr

+0

选择不同的数据结构。使用这样的字符串没有意义,然后解析字符串。只需使用一个字典,甚至是一个元组列表。 –

+1

另外,顺便说一句,不要使用'在f.readlines()'行,就用'的行F'。后者是更有效,这一个接一个读取行,你不必将整个文件读入内存,并兑现像前行的列表。 –

回答

4

我会推荐列表转换为dict ionary可快速方便的查找。

这是如何在你的列表转换为一个字典:

In [550]: t_list = ['Mr Moose : Maths', 'Mr Goose: History', 'Mrs Marvin: Computing'] 

In [556]: t_dict = dict(tuple(map(str.strip, x.split(':'))) for x in t_list); t_dict 
Out[556]: {'Mr Goose': 'History', 'Mr Moose': 'Maths', 'Mrs Marvin': 'Computing'} 

正如指出的那样,如果你能保证周围:一个空间,可以缩短map(str.strip, x.split(':'))x.split(' : ')

现在,如果你想有一个特定的老师教的主题,所有你需要做的是用字典索引得到它:

In [557]: t_dict['Mr Moose'] 
Out[557]: 'Maths' 
+2

如果你确信你的数据总是能够很好地形成,你可以用'x.split'(':')替换'map(str.strip,x.split(':'))'' 编辑:Aaaaand忽略我,因为我误解了示例数据。 –

+0

@ JakeConkerton - 美的确,谢谢。 –

1

我同意,字典查找是最好的。另一种方法来解决这个问题:

>>> with open('teacherbook.txt') as teacher_file: 
...  alldata = [line.split(':') for line in teacher_file] 
# [['Mr Moose', 'Maths'], ['Mr Goose', 'History'], ... ] 


>>> teacher_dict = {line[0]: line[1].strip() for line in alldata} 
# {'Mr Moose': 'Maths', 'Mr Goose': 'History', ... } 
相关问题