【问题标题】:I am trying to build a concatenated dictionary from a dictionary of dictionaries我正在尝试从字典字典中构建连接字典
【发布时间】:2021-02-02 12:37:22
【问题描述】:

我正在尝试将程序在下面生成的黑胶唱片字典('sample_music_dict')转换为一个新字典(见下文,'new_music_dict'),该字典将艺术家的专辑连接到单个列表中,其中艺术家成为关键。然后我将使用这本新词典来制作印刷品、屏幕列表和其他东西。

源字典。这是我要转换的字典

sample_music_dict = {
    
    'A-HA': [
        'A-Ha',
        ['HEADLINES & DEADLINES', 'Headlines & Deadlines', 'Jan-17', '']
    ],

    'ABC': [
        'Abc',
        ['THE LEXICON OF LOVE', 'The Lexicon Of Love', 'Jan-17', '']
    ],

    'AC/DC': [
        'Ac/Dc',
        ['BACK IN BLACK', 'Back In Black', 'Jan-17', ''],
        ['HIGHWAY TO HELL', 'Highway to Hell', 'Jan-17', '']
    ],

    'JON ANDERSON': [
        'Jon Anderson',
        ['3 SHIPS', '3 Ships', 'Nov-19', ''],
        ['IN THE CITY OF ANGELS', 'In The City Of Angels', 'Jan-17', ''],
        ['OLIAS OF SUNHILLOW', 'Olias of Sunhillow', 'Jan-17', '']
    ]

}

目标词典。这是我要转换成的字典

new_music_dict = {
    'Abba':['Abba Greatest Hits Vol.2'],
    'ABC':['The Lexicon Of Love'],
    'AC/DC':['Back In Black','Highway to Hell'],
    'All About Eve':['All About Eve'],
    'Jon  Anderson':['3 Ships','In The City Of Angels','Olias of 
    Sunhillow']
    }

为了解决这个问题,我尝试通过使用代码 for 和 while 语句来迭代源字典,但我不知道如何将数据提取为我需要的列表格式。

例如,如果我将源字典分解为它的基本形式,它有一个 KEY(艺术家姓名大写),VALUE 是一个列表,其中包含 Title Case 中的艺术家姓名,后跟多个列表 - 每张专辑一个列表为艺术家。在每个子列表中是专辑名称和关于专辑的其他三个信息。 像这样:

sample_music_dict = {
'KEY': 
['Value' 
['L1_0 - Album Nme', 'L1_1- Info1', 'L1_2- Info2', 'L1_3- Info3',
 ['L2_0 - Album Nme', 'L2_1- Info1', 'L2_2- Info2', 'L2_3- Info3'],
  ['L3_0 - Album Nme', 'L3_1- Info1', 'L3_2- Info2', 'L3_3- Info3'], 
   ['L4_0 - Album Nme', 'L4_1- Info1', 'L4_2- Info2', 'L4_3- Info3']
}

我想要生成的是一个字典,其中 KEY 作为艺术家名称,然后是一个包含该艺术家所有专辑名称的列表。就像下面的大纲:

new_music_dict = {
  'KEY': ['L1_0 - Album Nme','L2_0 - Album Nme',
  'L3_0 - Album Nme','L4_0 - Album Nme'] 
  }

一个艺术家的真实数据可能有 10 张专辑或只有两张专辑,因此专辑的数量可以是可变的。

一旦我可以生成我想要的目标字典格式,我就可以使用新字典生成表格数据输出(PrettyTable 或 TextTable),并在我的程序中创建不同的功能。

有什么帮助或建议吗? 谢谢。

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    感谢您编辑您的原始问题,并为此付出了如此多的努力!这是一个似乎可行的解决方案:

    import pprint
    
    sample_music_dict = {
        
        'A-HA': [
            'A-Ha',
            ['HEADLINES & DEADLINES', 'Headlines & Deadlines', 'Jan-17', '']
        ],
    
        'ABC': [
            'Abc',
            ['THE LEXICON OF LOVE', 'The Lexicon Of Love', 'Jan-17', '']
        ],
    
        'AC/DC': [
            'Ac/Dc',
            ['BACK IN BLACK', 'Back In Black', 'Jan-17', ''],
            ['HIGHWAY TO HELL', 'Highway to Hell', 'Jan-17', '']
        ],
    
        'JON ANDERSON': [
            'Jon Anderson',
            ['3 SHIPS', '3 Ships', 'Nov-19', ''],
            ['IN THE CITY OF ANGELS', 'In The City Of Angels', 'Jan-17', ''],
            ['OLIAS OF SUNHILLOW', 'Olias of Sunhillow', 'Jan-17', '']
        ]
    
    }
    
    def get_pairs():
        from operator import itemgetter
        for key, value in sample_music_dict.items():
            yield key, list(map(itemgetter(1), value[1:]))
    
    new_music_dict = dict(get_pairs())
    
    pprint.pprint(new_music_dict)
    

    输出:

    {'A-HA': ['Headlines & Deadlines'],
     'ABC': ['The Lexicon Of Love'],
     'AC/DC': ['Back In Black', 'Highway to Hell'],
     'JON ANDERSON': ['3 Ships', 'In The City Of Angels', 'Olias of Sunhillow']}
    >>> 
    

    pprint 模块不是严格要求的,只是为了让我可以得到漂亮的打印输出。您说您希望列表中的字符串来自每个专辑列表的第一个“列”(索引) - 但它不应该是第二个索引,而不是第一个?由于第一个索引包含全大写标题...此解决方案假定我们想要的专辑标题位于每个专辑列表的第二个索引处。

    【讨论】:

    • 嗨,我已经更新了我的问题,希望能清楚地解释我想要解决的问题。谢谢。
    • @milesabc123 谢谢,我已经编辑了我的答案。
    • 您好,Paul,非常感谢您的建议,效果非常好。我想知道是否要提取专辑名称和日期,您提供的代码可以修改以处理列表中的多个索引吗?谢谢
    • @milesabc123 很高兴它工作正常。要同时获取专辑名称和日期,您只需将itemgetter(1) 更改为itemgetter(1, 2)。这将产生键值对,但是其中的值是元组列表。我不知道这是否是你想要的。在这种情况下,期望的输出是什么?
    【解决方案2】:

    所以我想我可以尝试从我的数据中提取多条信息。例如一个食谱程序:

    ''' sample_data = {'完美煎饼食谱': ['完美煎饼食谱',['100g 普通面粉','2 个鸡蛋','300ml 半 脱脂牛奶”、“1 汤匙葵花籽油或蔬菜,外加额外的油炸食品”, '捏盐'],['1.将100克普通面粉和一小撮盐放入一个大碗中 搅拌碗。', '2.在中间挖一口井,打入2个鸡蛋 中间。'], 'bbc'] }

    def get_pairs_new():
        from operator import itemgetter
        for key, value in sample_data.items():
            yield key, list(map(itemgetter(1), value[1:]))
    
    
    recipe = dict(get_pairs_new())
    print(new_music_dict)
    
    
    t = Texttable()
    for key, value in recipe.items():
    artist = key
    album = ("\n".join(value))
    t.add_rows([['Artist', 'Album'], [artist, album]])
    print(t.draw())
    

    '''

    然后能够在表格中打印出配方的名称、成分和说明以及来源。如果我将 itemgetter(1) 更改为 itemgetter(1,2) 它返回一个元组然后程序崩溃。 谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2014-10-02
      • 2016-11-20
      相关资源
      最近更新 更多