2017-11-11 108 views
1

我有一个包含多个词典,我可以例如与访问一个大的列表:追加多个字典元素列出

>>> papers[0]['TI'] 
"Presence of tau pathology within fetal neural allografts in patients with Huntington's and Parkinson's disease." 

我需要访问列表中的所有的字典的3个不同的密钥([” TI'],['AB']和['MH']),然后将它们打印到一个.txt文件中,但此时我的代码只打印出其中一个键(['TI'])字典。这是我有:

papers = [] # the list of dictionaries 

for each in range(0, len(papers)): 
    out = [] 
    try: 
     out.append(str(papers[each]['TI']) + "\n" + str(papers[each]['AB']) + "\n" + str(papers[each]['MH']) + "\n") 
    except KeyError: 
     out.append("MISSING INFORMATION \n") 

for index, line in enumerate(out): 
    with open(filename+'_{}.txt'.format(index), 'w') as output: 
     output.write(line) 

注:我加STR(),以每个文件密钥,因为我一直得到这个错误:

TypeError: cannot concatenate 'str' and 'list' objects 

什么可能是错误的,因为我不能打印3个不同的键,但只有一个?任何帮助,将不胜感激。

+0

可以打印值?也许有一个包含一个列表的条目(即使大多数条目包含一个字符串) –

+0

也许你可以附加出三个键,而不只是第一个。 – fernand0

+0

还注意到:'对于索引,在枚举(输出)中的行: 与开放(文件名+'_ {}。txt'.format(索引),'w')作为输出: output.write(line)'that's incorrect ,换'与'和'for'行,否则你只写最后一行 –

回答

1

我可能会做这样的事情:

papers = [] # the list of dictionaries 
out = [] 
# ... 
# populate your papers list 
# ... 
for paper in papers: 
    try: 
     paper_string = "{TH}\n{AB}\n{MH}\n".format(
      TH=paper['TH'], 
      AB=paper['AB'], 
      MH=paper['MH']) 
    except KeyError: 
     paper_string = "MISSING INFORMATION\n" 
    finally: 
     out.append(paper_string) 
+0

这样做的工作。谢谢:) – tanmald

+0

使用'format'也会转换为字符串。所以它隐藏了问题&相当于OP代码(除了它似乎更pythonic) –

+0

格式的好处是,它不创建'+ ='所做的中间字符串,因为所有字符串在python中是不可变的。 –

0

试试这个代码:

papers=[] 
out = [] 

for index,value in enumerate(papers): 
    try: 
     out.append(str(papers[index]['TH']) + "\n" + str(papers[index]['AB']) + "\n" + str(papers[index]['MH']) + "\n") 
    except KeyError: 
     out.append("MISSING INFORMATION \n") 

    print(out) 
+0

我曾尝试在for循环之外“out”,但它似乎没有任何区别。其余代码不起作用,因为它打印的所有内容都是多个“缺少的信息”的 – tanmald

+0

您正在循环内的“out”中附加值,但是您在当前循环之外使用了“out”。 你可以给我一个列表数据的样本,我试过的是这个代码,我试着用这个数据: https://dpaste.de/8HTy –

+0

你真的需要'index'吗? “T。这是解决OP问题吗?:No. –

1

的问题是你OUT = []是里面的for循环。每次迭代它都会重新初始化为一个空白列表。

一些小建议:

  1. 只是用于每个文件(不需要范围)

  2. 得到您的字符串键可以使用每个[关键],因为每个 代表循环正在查看的论文中的当前条目。

如果你只想静静地通过你的文件列表/你能做到这一点,而不尝试,除了为好,使用IFS以确保你没有创建与丢失的钥匙例外。这里是我的testcode:

dict1 = {'TI':'baa', 'AB':'baar', 'MH':'maa', 'DK':'maar'} # all keys and more 
dict2 = {'TI':'baa', 'AB':'baar', 'MH':'maa', 'DK':'maar'} 
dict3 = {'OG':'moo', 'AG':'moor', 'ND':'raa', 'DG':'raar'} # none of the keys 
dict4 = {'TI':'baa', 'AG':'moor', 'MH':'maa', 'DG':'raar'} # Two of the keys 


papers = [dict1, dict2, dict3, dict4] 

out = [] 

for paper in papers: # Automatically iterates over all list entries in papers. 


    # if all papers always have all three keys: 
    ##results = ''.join((paper['TI'], '\n', paper['AB'], '\n', paper['MH'])) 

    ##out.append(results) 

    # OR: If they may have only (any) one of the keys: 

    results = '' 

    if 'TI' in paper: results+=paper['TI'] 
    if 'AB' in paper: results+='\n'+paper['AB'] 
    if 'MH' in paper: results+='\n'+paper['MH'] 

    out.append(results) 

这是出于对第二个版本:

['baa\nbaar\nmaa', 'baa\nbaar\nmaa', '', 'baa\nmaa']

+0

我确实在for循环之外使用了out,因为我没有看到任何结果,所以我将它移入循环内部,但是像Ayodhyankit Paul说的那样,我在循环外部使用,所以它的位置在外部。至于其他代码,@sterling baldwin的答案首先为我做了诀窍,但是对于缺少的信息的提示很有用,所以我也会将其用于代码中。谢谢 :) – tanmald