2012-07-03 55 views
0

输入文件看起来是这样的:的Python把非均匀线成字典

A 3.00 B 4.00 C 5.00 D 6.00 
E 3.20 F 6.00 G 8.22 
H 9.00 
I 9.23 J 89.2 
K 32.344 

而且我想要的人物是键在字典中 而彩车作为值。

这是我迄今为止的非工作失败。

def main(): 
    #Input File 
    reader = open('candidate.txt', 'r' 

    my_dictionary = {} 
    i=0 
    for line in reader.readlines(): 
     variable = line.split(' ')[i] 
     value = line.split(' ')[i+1] 
     my_dictionary[variable]= value 
     i+=2 

     print my_dictionary 

if __name__ == '__main__': 
    main() 
+0

想想你的代码片刻。 'i'每行增加2,对吧?所以你得到第一行的第一对,第二行的第二对,等等,这显然不是你想要的,对吧?你需要两个嵌套for循环,一个用于行,一个用于获得一行内的所有对(如果你想继续使用循环 - 有更高效的选项,请参阅guettli的答案)。 – weronika

+0

基本上,您需要成对(键值)迭代列表中的项目。这里是一个广泛的答案,显示不同的技术:http://stackoverflow.com/questions/4628290/pairs-from-single-list - 我喜欢从接受的答案'pairwise'功能。 – Sergey

+0

@ user1497892请接受答案。或添加评论为什么答案不能解决您的问题。 – guettli

回答

7
s='''A 3.00 B 4.00 C 5.00 D 6.00 
E 3.20 F 6.00 G 8.22 
H 9.00 
I 9.23 J 89.2 
K 32.344 
''' 

s=s.split() 
d=dict(zip(s[::2], s[1::2])) 
print d 

在上下文:

my_dict = dict() 
for line in reader.readlines(): 
    pairs = line.split() 
    for key, value in zip(pairs[::2],pairs[1::2]): 
     my_dict[key] = value # strip() not needed 
+1

美丽的答案! –

+0

嘿!感谢您的回复,但有没有办法做到这一点,而无需通过添加引号来修改输入文件?输入文件正在给我。 – user1497892

+0

非常好,尽管如果我是OP,我不会使用这个确切的代码。尽可能避免一次读完整个文件总是更好。不过,这段代码是一个非常简洁的好主意演示。 –

0

在这里是使用上一个流上进行操作的迭代器的溶液(并因此不依赖于第一读取整个输入):

from itertools import izip 

def group(iterable, n): 
    """Yield iterable's items n at a time""" 
    args = [iter(iterable)]*n 
    return izip(*args) 


def dictize(stream): 
    r = {} 
    for line in stream: 
     for k,v in group(line.split(), 2): 
      r[k] = v 
    return r 


from StringIO import StringIO 

testinput = """A 3.00 B 4.00 C 5.00 D 6.00 
E 3.20 F 6.00 G 8.22 
H 9.00 
I 9.23 J 89.2 
K 32.344""" 

teststream = StringIO(testinput) 

print dictize(teststream) 

如果你可以使用词典理解插件,你可以用一行代码替换dictize功能:

print {k:v for line in teststream for k,v in group(line.split(),2)} 
0
with open('candidate.txt', 'r') as reader: 
    print dict(zip(*[iter(reader.read().split())]*2)) 

With打开的文件流称为reader我们read它作为一个整体,然后用空白split它切成小块。现在我们有一个单词列表,我们将其转换为一个iter ator并将其放在一个列表中,并将其乘以2以使两个相同迭代器的列表相同。这些是zip成对输入为一个dict离子。