根据具有x个元素的列表对具有n个元素的元组进行排序
我有一个如下所示的元组
all_combi= [
('a', 33.333333333333336),
('a', 38.333333333333336),
('a', 43.333333333333336),
('a', 48.333333333333336),
('a', 53.333333333333336),
('a', 58.333333333333336),
('a', 63.333333333333336),
('a', 68.33333333333334),
('a', 73.33333333333334),
('a', 78.33333333333334),
('a', 83.33333333333334),
('a', 88.33333333333334),
('a', 93.33333333333334),
('a', 98.33333333333334),
('b', 33.333333333333336),
('b', 38.333333333333336),
('b', 43.333333333333336),
('b', 48.333333333333336),
('b', 53.333333333333336),
('b', 58.333333333333336),
('b', 63.333333333333336),
('b', 68.33333333333334),
('b', 73.33333333333334),
('b', 78.33333333333334),
('b', 83.33333333333334),
('b', 88.33333333333334),
('b', 93.33333333333334),
('b', 98.33333333333334),
('c', 33.333333333333336),
('c', 38.333333333333336),
('c', 43.333333333333336),
('c', 48.333333333333336),
('c', 53.333333333333336),
('c', 58.333333333333336),
('c', 63.333333333333336),
('c', 68.33333333333334),
('c', 73.33333333333334),
('c', 78.33333333333334),
('c', 83.33333333333334),
('c', 88.33333333333334),
('c', 93.33333333333334),
('c', 98.33333333333334)]
我想根据这个列表对这个元组进行排序
instr_list. = ['a', 'b', 'c']
下面给出了预期输出的示例
[[
('a', 33.333333333333336),
('b', 33.333333333333336),
('c', 33.333333333333336)
], [
[('a', 33.333333333333336),
('b', 38.333333333333336),
('c', 43.333333333333336)]
]]
我尝试了此处给出的以下解决方案,以根据列表对元组进行排序。但它并没有给出想要的结果。我尝试使用显式循环,但它不起作用。任何帮助表示赞赏...
def get_slab_list(all_combi, instr_list):
out_master_list = []
for i in range(len(instr_list)):
#k=0
out_list=[]
for j in all_combi:
if j[0] == instr_list[i]:
out_list.append(j[1])
out_master_list.append(out_list)
return out_master_list
sample = get_slab_list(all_combi, instr_list)
回答
这是您可以尝试的解决方案,使用sorted+groupby
from itertools import groupby
# if data is already sorted, you can avoid this step.
all_combi = sorted(all_combi, key=lambda x: x[1])
print(
[[i for i in v if i[0] in instr_list] # filter out only required keys
for _, v in groupby(all_combi, key=lambda x: x[1])]
)
[[('a', 33.333333333333336),
('b', 33.333333333333336),
('c', 33.333333333333336)],
[('a', 38.333333333333336),
('b', 38.333333333333336),
('c', 38.333333333333336)],
...
- You could have simply done `list(zip(*[list(j) for i, j in groupby(all_combi, key = lambda x: x[0])]))`