如何根据元组包含的字符串对元组列表进行分组?

2024-09-30 22:17:07 发布

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

我有两个字符串元组的排序列表。我还有另外一个列表,其中一些元组中有4个字符串。我想从这4个字符串中的一个到列表中的下一个。这有点难解释,所以我来演示一下。在

original_list = [('1321', 01), ('MessageXZY', 02), ('DescriptionSKS', 03), ('S7_6', 04), ('S7_3', 05), ('0A3B', 06), ('MessageZYA', 07),
 ('DescriptionKAM', 08), ('9K44', 09), ('MessageYAL', 10),
 ('DescriptionAUS', 11), ('S7_2', 12)]

我把术语1321OA3B9K44保存在另一个列表中。我想将这些术语之间(包括这些术语)的所有内容组合成一个元组,如下所示:

^{pr2}$

如果包含我的4个字符项的列表称为code,而包含元组的列表称为original\u list,我需要什么代码来实现这一点?在

编辑:这就是我要做的:

^{3}$

Tags: 字符串列表排序list术语元组originals7
2条回答

我假设你有一个代码列表,你想用它来拆分。根据这个,看看这个代码是否适合你。在

original_list = [('1321', '01'), ('MessageXZY', '02'), ('DescriptionSKS', '03'), ('S7_6', '04'), ('S7_3', '05'), ('0A3B', '06'), ('MessageZYA', '07'), ('DescriptionKAM', '08'), ('9K44', '09'), ('MessageYAL', '10'),
 ('DescriptionAUS', '11'), ('S7_2', '12')]

code_list = ['1321', '0A3B','9K44']


grouped_tuples = []
for entry in original_list:
    if entry[0] in code_list:
        new_tuple = []
        new_tuple.append(entry)
        for i in range(original_list.index(entry)+1, len(original_list)):
            if(original_list[i][0] not in code_list):
                new_tuple.append(original_list[i])
            else:
                break
        grouped_tuples.append(tuple(new_tuple))
print grouped_tuples

来自Ruby背景,我经常觉得需要在Python中使用^{}之类的东西。它基本上把任何iterable分成块。切片在谓词为true的每个元素之前完成。在

基于Rubinius implementation,我将代码移植到Python。在

def slice_before(iterable, predicate):
    chunk = None
    for elem in iter(iterable):
        if predicate(elem):
            if chunk:
                yield chunk
            chunk = [elem]
        else:
            if not chunk:
                chunk = []
            chunk.append(elem)
    if chunk:
        yield chunk

以下是几个例子:

^{pr2}$

你只需要初始化你的数据。请注意,code_list可以是一个用于更快查找的集合:

original_list = [('1321', '01'), ('MessageXZY', '02'), ('DescriptionSKS', '03'), ('S7_6', '04'), ('S7_3', '05'), ('0A3B', '06'), ('MessageZYA', '07'), ('DescriptionKAM', '08'), ('9K44', '09'), ('MessageYAL', '10'),
 ('DescriptionAUS', '11'), ('S7_2', '12')]

code_list = {'1321', '0A3B','9K44'}

您的问题所需的代码将变成slice_before的一行代码:

print(list(slice_before(original_list, lambda x_y: x_y[0] in code_list)))
# [[('1321', '01'), ('MessageXZY', '02'), ('DescriptionSKS', '03'), ('S7_6', '04'), ('S7_3', '05')], [('0A3B', '06'), ('MessageZYA', '07'), ('DescriptionKAM', '08')], [('9K44', '09'), ('MessageYAL', '10'), ('DescriptionAUS', '11'), ('S7_2', '12')]]

相关问题 更多 >