在运行时将每个段落从文件读取到多个列表中

时间:2014-01-26 12:00:31

标签: python file list

说我有一个像

这样的文件
ID1


Some name

Address

Salary

Gender


ID2

Some name

Address

Salary

Gender

...

IDn

我已经阅读了文件,对其进行了排序,并将所有字段添加到了像

这样的列表中
[ID1 , name,Address,Salary,Gender,ID2,name,Address,Salart,Gender..]

我需要的是,列表说

ID1= [name,address,Salary,Gender] ,
ID2 = [name,Address,salary,Gender]  and so on.

2 个答案:

答案 0 :(得分:1)

如果您已在列表中使用它们,则需要使用grouper recipe创建字典:

from itertools import izip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

ids = {i[0]: i[1:] for i in grouper(the_list,5)}

你最终会得到:

>>> the_list
['ID1', 'name1', 'address1', 'salary1', 'gender1', 'ID2', 'name2', 'address2',
'salary2', 'gender2']
>>> ids = {i[0]: i[1:] for i in grouper(the_list, 5)}
>>> ids
{'ID2': ('name2', 'address2', 'salary2', 'gender2'), 'ID1': ('name1', 'address1'
, 'salary1', 'gender1')}

答案 1 :(得分:1)

您正在迭代的数据是文件对象。您可以对其应用所有itertools技巧,将数据重新格式化为使用键ID索引的列表字典

所以你从一个发电机开始。该发生器剥离所有非空行。然后你只需迭代这个生成器并使用字典理解创建一个字典。使用itertools.islice将迭代器推进到某个范围,使下一个项目用作键。

<强>实施

from itertools import imap, islice
with open("data") as fin:
    data = (line for line in imap(str.strip, fin) if line)
    data = {line: list(islice(data, 0, 4)) for line in data}

<强>输出

print data
{'ID2': ['Some name', 'Address', 'Salary', 'Gender'], 'ID1': ['Some name', 'Address', 'Salary', 'Gender']}