基于包含x个元素的列表,对包含n个元素的元组进行排序

2024-04-29 12:37:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个元组,如下所示

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)]
 ]]

我尝试了在here给出的以下解决方案,根据列表对元组进行排序。但它并没有给出预期的结果。 我尝试使用显式循环,但它不起作用。感谢您的帮助

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)

Tags: inmaster示例列表forget排序all
2条回答

试试这个:

def get_slab_list(all_combi, instr_list):
    all_combi.sort()
    op = []
    div = len(all_combi)//len(instr_list)
    for i in range(div):
        tmp = []
        for j in range(len(instr_list)):
            tmp.append(all_combi[j*div + i])
        op.append(tmp)

    return op


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']
sample = get_slab_list(all_combi, instr_list)
print(sample)

输出:

[[('a', 33.333333333333336), ('b', 33.333333333333336), ('c', 33.333333333333336)], [('a', 38.333333333333336), ('b', 38.333333333333336), ('c', 38.333333333333336)], [('a', 43.333333333333336), ('b', 43.333333333333336), ('c', 43.333333333333336)], [('a', 48.333333333333336), ('b', 48.333333333333336), ('c', 48.333333333333336)], [('a', 53.333333333333336), ('b', 53.333333333333336), ('c', 53.333333333333336)], [('a', 58.333333333333336), ('b', 58.333333333333336), ('c', 58.333333333333336)], [('a', 63.333333333333336), ('b', 63.333333333333336), ('c', 63.333333333333336)], [('a', 68.33333333333334), ('b', 68.33333333333334), ('c', 68.33333333333334)], [('a', 73.33333333333334), ('b', 73.33333333333334), ('c', 73.33333333333334)], [('a', 78.33333333333334), ('b', 78.33333333333334), ('c', 78.33333333333334)], [('a', 83.33333333333334), ('b', 83.33333333333334), ('c', 83.33333333333334)], [('a', 88.33333333333334), ('b', 88.33333333333334), ('c', 88.33333333333334)], [('a', 93.33333333333334), ('b', 93.33333333333334), ('c', 93.33333333333334)], [('a', 98`.33333333333334), ('b', 98.33333333333334), ('c', 98.33333333333334)]]

下面是您可以尝试的解决方案,使用^{}+^{}

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)],
...

相关问题 更多 >