【问题标题】:Python - Return a new list of dictionaries whiteout certain keys and their valuesPython - 返回一个新的字典列表,清除某些键及其值
【发布时间】:2021-07-24 05:49:27
【问题描述】:

上下文:我需要返回列表的每个字典中存在的某些键及其值

问题:我就是无法正确解决问题,无论是通过迭代、过滤还是列表逻辑...

以下是需要过滤的列表示例:

[{
"id": "id1",
"date": "2021-01-05 03:05:06",
"prochain_joueur": "joueur1",
"joueurs": ["joueur1", "joueur2"],
"state": ["pio1","pio2"],
"gagnant": "Jorje"
}, 
{...},
{
"id": "id23",
"date": "2021-01-05 03:05:06",
"prochain_joueur": "joueur2",
"joueurs": ["joueur1", "joueur2"],
"state": ["pio1","pio2"],
"gagnant": "Castillo"
}]

这里是需要返回的:

[{
    "id": "80a0a0d2-059d-4539-9d53-78b3f6045943",
    "date": "2021-01-23 14:23:59",
    "joueurs": ["jowic42", "robot-1"],
    "gagnant": "jowic42"
},
{...},
{
    "id": "80a0a0d2-059d-4539-9d53-78b3f6045943",
    "date": "2021-02-23 14:23:59",
    "joueurs": ["jowic42", "robot-1"],
    "gagnant": "jowic42"
}]

只是需要返回带有键“prochain_joueur”和“state”的相同列表,我就是想不通。请注意,列表最初是在 Json 中,我需要返回最后 20 个条目,并且需要在 Json 中返回,但是,我实际上知道如何做这部分!

【问题讨论】:

    标签: python-3.x list dictionary filtering


    【解决方案1】:

    我是用这个做的:

    for dict_iter in list_dict:
        for key in keys_to_delete:
            if key in dict_iter.keys():
                del dict_iter[key]
    
    

    list_dict 是您的字典列表,keys_to_delete 是您想要输出的键列表,例如["prochain_joueur", "state"]

    【讨论】:

      【解决方案2】:

      您可以列出您不想要的键,然后在列表推导中使用字典推导将它们过滤掉。鉴于您的原始列表为l

      unwanted = ["prochain_joueur" , "state"]
      filtered = [{k:v for k, v in d.items() if k not in unwanted} for d in l]
      

      这会给你:

      [{'id': 'id1',
        'date': '2021-01-05 03:05:06',
        'joueurs': ['joueur1', 'joueur2'],
        'gagnant': 'Jorje'},
       {'id': 'id23',
        'date': '2021-01-05 03:05:06',
        'joueurs': ['joueur1', 'joueur2'],
        'gagnant': 'Castillo'}]
      

      【讨论】:

        【解决方案3】:

        给定:
        list_of_keys = 包含所有要复制的键的列表
        list_of_dicts = 要搜索的字典列表

        def return_keys(list_of_keys, list_of_dicts):
            rslt = []
            for dct in list_of_dicts:
                td = {}
                for k in list_of_keys:
                    if k in dct.keys():
                        td[k] = dct[k]
                rslt.append(td)
            return rslt
        

        【讨论】:

          【解决方案4】:

          这是pandas 的一种方法。您将字典列表加载到pandas.DataFrame;键成为您的列,行成为您的值。如果您的一个字典中不存在某个键,则该行中的相应值将是nan。因此,您可以删除所有至少具有一个 nan 值的列。

          import pandas as pd
          
          df = pd.DataFrame(your_list)
          df.dropna(axis=1, inplace=True) # Delete columns with nan
          
          >>> df.columns
          Index(['id', 'date', 'joueurs', 'gagnant'], dtype='object')
          

          然后将您的数据框转换回字典列表:

          new_list = df.to_dict('records') 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-05-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-12
            • 1970-01-01
            相关资源
            最近更新 更多