【问题标题】:Reading each paragraph from a file into several lists during run time在运行时将文件中的每个段落读入多个列表
【发布时间】:2014-01-26 12:00:30
【问题描述】:

假设我有一个类似的文件,

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.

【问题讨论】:

  • 如果它是您正在创建的文件,我建议使用yaml foramt 从文件中生成简单易用的 dict 结构将非常容易。
  • @KobiK:让我试试这个。!!

标签: python file list


【解决方案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']}

【讨论】:

    【解决方案2】:

    如果您已经将它们放在列表中,则需要使用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')}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 2019-07-31
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多