我有一个包含字典(List[Dict, Dict, ...])的列表,我想基于两个键对列表进行uniqify,但我想保留字典中另一个键的值,以确保在我想保留的键中创建一个列表不会丢失它.我使用Python编写代码.如果有什么意义的话.确切地说是x.

假设我有以下三个键的字典列表:numberfavoritecolor.我想使用键numberfavorite对列表元素进行uniqify.然而,对于具有相同值numberfavorite的字典,我想在键color下添加一个列表,以确保对于相同的numberfavorite组合,我有所有的color.这个列表也应该是唯一的,因为对于同一个组合,它不需要重复colors.但是,如果最终结果中的键 colored颜色 只有一个元素,那么它应该是字符串而不是列表.

lst = [
{'number': 1, 'favorite': False, 'color': 'red'},
{'number': 1, 'favorite': False, 'color': 'green'},
{'number': 1, 'favorite': False, 'color': 'red'},
{'number': 1, 'favorite': True, 'color': 'red'},
{'number': 2, 'favorite': False, 'color': 'red'}]

使用前面提到的uniqify,我将得到以下结果:

lst = [
    {'number': 1, 'favorite': False, 'color': {'red', 'green'}},
    {'number': 1, 'favorite': True, 'color': 'red'},
    {'number': 2, 'favorite': False, 'color': 'red'},
]

请注意,red只有一个实例,其中number1favoriteFalse,尽管它在未被限定之前在列表中出现了两次.还要注意的是,当第二个dict中的键color只有一个元素时,它是一个字符串而不是一个列表.

推荐答案

使用纯python,您可以在OrderedDict中插入,以保持插入顺序:

from collections import OrderedDict

d = OrderedDict()
for l in lst:
    d.setdefault((l['number'], l['favorite']), set()).add(l['color'])

[{'number': k[0], 'favorite': k[1], 'color': v.pop() if len(v) == 1 else v} 
    for k, v in d.items()]   
# [{'color': {'green', 'red'}, 'favorite': False, 'number': 1},
#  {'color': 'red', 'favorite': True, 'number': 1},
#  {'color': 'red', 'favorite': False, 'number': 2}]

使用pandas GroupBy API也可以很容易地做到这一点:

import pandas as pd

d = (pd.DataFrame(lst)
       .groupby(['number', 'favorite'])
       .color
       .agg(set)
       .reset_index()
       .to_dict('r'))
d
# [{'color': {'green', 'red'}, 'favorite': False, 'number': 1},
#  {'color': {'red'}, 'favorite': True, 'number': 1},
#  {'color': {'red'}, 'favorite': False, 'number': 2}]

如果需要单个元素的字符串条件,可以使用

[{'color': (lambda v: v.pop() if len(v) == 1 else v)(d_.pop('color')), **d_} 
     for d_ in d]
# [{'color': {'green', 'red'}, 'favorite': False, 'number': 1},
#  {'color': 'red', 'favorite': True, 'number': 1},
#  {'color': 'red', 'favorite': False, 'number': 2}]

Python-3.x相关问答推荐

只有在Chrome尚未打开的情况下,打开Chrome后,PySimpleGUI窗口才会崩溃

Pandas -我们如何在一行中应用多个要求

如何将参数/值从测试方法传递给pytest的fixture函数?

无法使用xpath关闭selenium中的弹出窗口

ValueError at /register/ 视图authenticate.views.register_user 未返回HttpResponse 对象.它返回 None 相反

将自定义函数应用于 pandas 数据框的每一列

TypeError: issubclass() arg 1 在 Flask 中导入 langchain 时必须是一个类

如何根据索引子列表对元素列表进行分组或批处理?

如何使用 Selenium 和 Python 作为线程来使用事件(Chrome-Developer-Tools)?

为什么 mypy 不适用于 sqlalchemy?

通过点和线计算CV2 Homography

请求:RecursionError:超出最大递归深度

在初始化之前禁用`__setattr__`的干净方法

ValueError:FixedLocator 位置的数量 (5),通常来自对 set_ticks 的调用,与刻度标签的数量 (12) 不匹配

如何调试垂死的 Jupyter Python3 内核?

为什么 2to3 将 mydict.keys() 更改为 list(mydict.keys())?

创建集合的 Python 性能比较 - set() 与 {} 文字

如何获得 BeautifulSoup 标签的所有直接子代?

PIL 在图像上绘制半透明方形覆盖

TypeError:只有整数标量数组可以转换为标量索引