【问题标题】:How to append lines in open file before empty line to a dictionary, and then continue appending the following lines until the next empty line?如何在空行之前将打开文件中的行追加到字典中,然后继续追加以下行直到下一个空行?
【发布时间】:2020-08-03 03:18:43
【问题描述】:

编码初学者,提前致谢!

我有一个文本文件,例如:

A
B
1
2

C
D
1
2
3
4

E
F
1
2
3
4
5
6

我要做的是生成一个字典,将空行之前的每个部分转换为键值对。例如,我的文本文件字典应该是:

{('A','B'): [[1],[2]], ('C','D'):[[1, 3], [2, 4]], ('E','F'):[[1, 3, 5],[2, 4, 6]]}

现在,我是这样开始我的功能的:

while line != '':
    # rest of function to append to dictionary here

但我已经意识到这只在第一个空行之前有效。如果我尝试继续阅读并打印函数之后的行,由于 while 循环的性质,打印的第一行是 D 而不是 C。如何在不导入任何内容的情况下解决此问题?

【问题讨论】:

    标签: python loops dictionary readline


    【解决方案1】:

    这是您可以做到的一种方法(假设文件结构与您所说的完全一样):

    首先创建一个包含所有行的字符串:

    lines = ''.join(list(open("test.txt")))
    #'A\nB\n1\n2\n\nC\nD\n1\n2\n3\n4\n\nE\nF\n1\n2\n3\n4\n5\n6'
    

    然后分成两对:

    pairs = lines.split('\n\n')
    #['A\nB\n1\n2', 'C\nD\n1\n2\n3\n4', 'E\nF\n1\n2\n3\n4\n5\n6']
    

    最后在每一对内拆分键和值:

    pairs = lines.split('\n\n')
    result = {}
    for pair in pairs:
        data = pair.split('\n')
        key = (data[0], data[1])
        first_value = data[2::2]
        second_value = data[3::2]
        result[key] = [first_value, second_value]
    result
    

    输出:

    {('A', 'B'): [['1'], ['2']],
     ('C', 'D'): [['1', '3'], ['2', '4']],
     ('E', 'F'): [['1', '3', '5'], ['2', '4', '6']]}
    

    注意:data[2::2] 表示数组切片从位置 2 开始,每 2 个元素迭代一次

    【讨论】:

    • 很抱歉,我不知道我应该把确切的文件结构(第一次在这个网站上),所以文件结构没有这么简单。我用文件结构更新了我的主要问题!谢谢你这么快回答!
    • 我等了很久,因为我意识到我又犯了一个错误,但我设法使您的解决方案适应我的!非常有帮助,我很感激你使用了如此清晰的语言,因为我理解正在发生的一切。再次感谢您!
    【解决方案2】:

    这样做:

    txt = x.read_text() # read file as string here
    txt = txt.split('\n\n')
    txt = list(map(lambda y: y.split('\n'), txt))
    
    keys = list(map(lambda y: y[:2], txt))
    values = list(map(lambda y: y[2:], txt))
    d = {tuple(key): [[value[0::2]], [value[1::2]]] for key in keys for value in values}
    

    【讨论】:

    • 这种方法很干净!但会消耗更多时间!
    • 谢谢!使用另一种方法,因为当我看到这个时我已经完成了一半,但是很高兴看到一个更短的方法。尝试了点赞,但因为我没有足够的声望,所以我会回来再试一次!
    • 没关系!!你不必:)
    猜你喜欢
    • 2016-12-25
    • 2012-01-18
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2011-02-19
    • 2018-01-13
    • 2012-04-02
    相关资源
    最近更新 更多