Python将非统一行放入字典中

时间:2012-07-03 06:41:05

标签: python file dictionary readline

输入文件如下所示:

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()

3 个答案:

答案 0 :(得分: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)

这是一个使用在流上运行的迭代器的解决方案(因此不依赖于首先读取整个输入):

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)}

答案 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离子的输入。