Python 在DICT列表中,按键的每组值应用函数

Python 在DICT列表中,按键的每组值应用函数,python,python-3.x,Python,Python 3.x,假设我有这个: my_list = [{'id':'1','value':'1'}, {'id':'1','value':'8'}, {'id':'2','value':'2'}, {'id':'2','value':'3'}, {'id':'2','value':'5'}, ] 我想分别为键id的每组值应用一个函数(例如shuffle) 我想举个例子: my_list = [{'id':'1','value':'1'}, {'id':'1','value':'8'}, {'id':'2','

假设我有这个:

my_list = [{'id':'1','value':'1'},
{'id':'1','value':'8'},
{'id':'2','value':'2'},
{'id':'2','value':'3'},
{'id':'2','value':'5'},
]
我想分别为键
id
的每组值应用一个函数(例如
shuffle

我想举个例子:

my_list = [{'id':'1','value':'1'},
{'id':'1','value':'8'},
{'id':'2','value':'3'},
{'id':'2','value':'5'},
{'id':'2','value':'2'},
]

因此,我不希望在不同的值组(例如
id
=1,2等)之间更改某些内容,而只希望在每个值组中分别更改这些内容。

如果您的列表按
'id'
排序,请直接使用
groupby
,或者按
'id'
排序,然后使用
groupby

from itertools import groupby
import random

my_list = [{'id':'1','value':'1'},
           {'id':'1','value':'8'},
           {'id':'2','value':'2'},
           {'id':'2','value':'3'},
           {'id':'2','value':'5'}]

res = []
for k, g in groupby(my_list, lambda x: x['id']):
    lst = list(g)
    random.shuffle(lst)
    res += lst

print(res)
# [{'id':'1','value':'1'},
#  {'id':'1','value':'8'},
#  {'id':'2','value':'3'},
#  {'id':'2','value':'5'},
#  {'id':'2','value':'2'}]

如果列表按
'id'
排序,请直接使用
groupby
,或按
'id'
排序,然后使用
groupby

from itertools import groupby
import random

my_list = [{'id':'1','value':'1'},
           {'id':'1','value':'8'},
           {'id':'2','value':'2'},
           {'id':'2','value':'3'},
           {'id':'2','value':'5'}]

res = []
for k, g in groupby(my_list, lambda x: x['id']):
    lst = list(g)
    random.shuffle(lst)
    res += lst

print(res)
# [{'id':'1','value':'1'},
#  {'id':'1','value':'8'},
#  {'id':'2','value':'3'},
#  {'id':'2','value':'5'},
#  {'id':'2','value':'2'}]

您是否应该使用
res+=lst
而不是append来将结果保持为一个平面列表?当我运行它时,会得到两个嵌套的结果lists@schwartz721哎呀。我的错;刚刚纠正。谢谢请记住,
groupby
仅在列表之前已排序的情况下才有效。如果不是,那么它就不起作用了。你不应该使用append而不是append来将结果保持为一个平面列表吗?当我运行它时,我会得到两个嵌套的lists@schwartz721哎呀。我的错;刚刚纠正。谢谢请记住,
groupby
仅在列表之前已排序的情况下才有效。如果不是的话,那就没用了。