Skip to main content
 首页 » 编程设计

python之将项目 append 到字典 Python

2025年05月04日84xiaohuochai

我正在尝试用 python 编写一个函数来打开文件并将其解析为字典。我正在尝试使列表 block 中的第一项成为字典 data 中每个项目的键。然后每个项目都应该是列表的其余部分 block 减去第一个项目。但出于某种原因,当我运行以下函数时,它会错误地解析它。我在下面提供了输出。我怎样才能像上面所说的那样解析它?任何帮助将不胜感激。

功能:

def parseData() : 
    filename="testdata.txt" 
    file=open(filename,"r+") 
 
    block=[] 
    for line in file: 
        block.append(line) 
        if line in ('\n', '\r\n'): 
            album=block.pop(1) 
            data[block[1]]=album 
            block=[] 
    print data 

输入:

Bob Dylan 
1966 Blonde on Blonde 
-Rainy Day Women #12 & 35 
-Pledging My Time 
-Visions of Johanna 
-One of Us Must Know (Sooner or Later) 
-I Want You 
-Stuck Inside of Mobile with the Memphis Blues Again 
-Leopard-Skin Pill-Box Hat 
-Just Like a Woman 
-Most Likely You Go Your Way (And I'll Go Mine) 
-Temporary Like Achilles 
-Absolutely Sweet Marie 
-4th Time Around 
-Obviously 5 Believers 
-Sad Eyed Lady of the Lowlands 

输出:

{'-Rainy Day Women #12 & 35\n': '1966 Blonde on Blonde\n', 
 '-Whole Lotta Love\n': '1969 II\n', '-In the Evening\n': '1979 In Through the Outdoor\n'} 

请您参考如下方法:

您可以使用 groupby 使用空行作为分隔符对数据进行分组,使用 defaultdict 重复键扩展从 groupby 返回的每个 val 的其余值提取键/第一个元素后。

from itertools import groupby 
from collections import defaultdict 
d = defaultdict(list) 
with open("file.txt") as f: 
    for k, val in groupby(f, lambda x: x.strip() != ""): 
        # if k is True we have a section 
       if k: 
            # get key  "k" which is the first line 
           # from each section, val will be the remaining lines 
           k,*v = val 
           # add or add to the existing key/value pairing 
           d[k].extend(map(str.rstrip,v)) 
from pprint import pprint as pp 
pp(d) 

输出:

{'Bob Dylan\n': ['1966 Blonde on Blonde', 
                 '-Rainy Day Women #12 & 35', 
                 '-Pledging My Time', 
                 '-Visions of Johanna', 
                 '-One of Us Must Know (Sooner or Later)', 
                 '-I Want You', 
                 '-Stuck Inside of Mobile with the Memphis Blues Again', 
                 '-Leopard-Skin Pill-Box Hat', 
                 '-Just Like a Woman', 
                 "-Most Likely You Go Your Way (And I'll Go Mine)", 
                 '-Temporary Like Achilles', 
                 '-Absolutely Sweet Marie', 
                 '-4th Time Around', 
                 '-Obviously 5 Believers', 
                 '-Sad Eyed Lady of the Lowlands'], 
 'Led Zeppelin\n': ['1979 In Through the Outdoor', 
                    '-In the Evening', 
                    '-South Bound Saurez', 
                    '-Fool in the Rain', 
                    '-Hot Dog', 
                    '-Carouselambra', 
                    '-All My Love', 
                    "-I'm Gonna Crawl", 
                    '1969 II', 
                    '-Whole Lotta Love', 
                    '-What Is and What Should Never Be', 
                    '-The Lemon Song', 
                    '-Thank You', 
                    '-Heartbreaker', 
                    "-Living Loving Maid (She's Just a Woman)", 
                    '-Ramble On', 
                    '-Moby Dick', 
                    '-Bring It on Home']} 

对于 python2,解压语法略有不同:

with open("file.txt") as f: 
    for k, val in groupby(f, lambda x: x.strip() != ""): 
        if k: 
            k, v = next(val), val 
            d[k].extend(map(str.rstrip, v)) 

如果你想保留换行符,请移除 map(str.rstrip..

如果您想要为每个艺术家分别制作专辑和歌曲:

from itertools import groupby 
from collections import defaultdict 
 
d = defaultdict(lambda: defaultdict(list)) 
with open("file.txt") as f: 
    for k, val in groupby(f, lambda x: x.strip() != ""): 
        if k: 
            k, alb, songs = next(val),next(val), val 
            d[k.rstrip()][alb.rstrip()] = list(map(str.rstrip, songs)) 
 
from pprint import pprint as pp 
 
pp(d) 
 
 
 
{'Bob Dylan': {'1966 Blonde on Blonde': ['-Rainy Day Women #12 & 35', 
                                         '-Pledging My Time', 
                                         '-Visions of Johanna', 
                                         '-One of Us Must Know (Sooner or ' 
                                         'Later)', 
                                         '-I Want You', 
                                         '-Stuck Inside of Mobile with the ' 
                                         'Memphis Blues Again', 
                                         '-Leopard-Skin Pill-Box Hat', 
                                         '-Just Like a Woman', 
                                         '-Most Likely You Go Your Way ' 
                                         "(And I'll Go Mine)", 
                                         '-Temporary Like Achilles', 
                                         '-Absolutely Sweet Marie', 
                                         '-4th Time Around', 
                                         '-Obviously 5 Believers', 
                                         '-Sad Eyed Lady of the Lowlands']}, 
 'Led Zeppelin': {'1969 II': ['-Whole Lotta Love', 
                              '-What Is and What Should Never Be', 
                              '-The Lemon Song', 
                              '-Thank You', 
                              '-Heartbreaker', 
                              "-Living Loving Maid (She's Just a Woman)", 
                              '-Ramble On', 
                              '-Moby Dick', 
                              '-Bring It on Home'], 
                  '1979 In Through the Outdoor': ['-In the Evening', 
                                                  '-South Bound Saurez', 
                                                  '-Fool in the Rain', 
                                                  '-Hot Dog', 
                                                  '-Carouselambra', 
                                                  '-All My Love', 
                                                  "-I'm Gonna Crawl"]}}