在运行tim期间,将文件中的每个段落读入多个列表

2024-09-29 06:23:35 发布

您现在位置:Python中文网/ 问答频道 /正文

比如说我有一份档案

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.

Tags: 文件name列表排序addresssome档案gender
2条回答

如果列表中已经有它们,则需要使用^{} 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')}

您正在迭代的数据是一个文件对象。您可以对它应用所有的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']}

相关问题 更多 >