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

Python 如何根据元组包含的字符串对元组列表进行分组?,python,list,tuples,Python,List,Tuples,我有一个两个字符串元组的排序列表。我还有另外一个列表,其中一些元组中有4个字符串。我想将这4个字符串中的一个分组到列表中的下一个。这有点难以解释,所以我将演示 original_list = [('1321', 01), ('MessageXZY', 02), ('DescriptionSKS', 03), ('S7_6', 04), ('S7_3', 05), ('0A3B', 06), ('MessageZYA', 07), ('DescriptionKAM', 08), ('9K44',

我有一个两个字符串元组的排序列表。我还有另外一个列表,其中一些元组中有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保存在另一个列表中。我想将这些术语之间(包括这些术语)的所有内容组合成一个元组,如下所示:

grouped_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))]
如果包含我的4个字符术语的列表被称为代码,而包含元组的列表被称为原始列表,我需要什么代码来实现这一点

编辑:这就是我要做的:

grouped_list = []
for tuple in original_list:
    for string in tuple:
        if string in code:
            grouped_list = list(zip ##zip that tuple and all consecutive tuples until the next item in code

我假设您有一个代码列表,您想使用它进行拆分。根据这一点,看看这个代码是否适合你

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的每个元素之前完成

基于,我将代码移植到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
以下是几个例子:

>>> list(slice_before(range(12), lambda i: i % 3 == 0))
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]
>>> list(slice_before('LetsTestSliceBefore', str.isupper))
[['L', 'e', 't', 's'], ['T', 'e', 's', 't'], ['S', 'l', 'i', 'c', 'e'], ['B', 'e', 'f', 'o', 'r', 'e']]
您只需要初始化数据。请注意,
code\u 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\u

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

你的要求不是很清楚。也许一个简单的例子和一些代码可以说明你的努力。它不清楚,包括你的第二个列表和后预期的输入和输出清楚。似乎已经删除了4个字符的条款(那些在代码列表)从原来的名单。我真正需要做的就是在原始\u列表的某些位置加上一些括号,从代码\u列表中包含4个字符项的元组开始,直到下一个包含4个字符项的元组为止。@david\u 10001:我觉得输出是正确的。或者至少,与您编写的输出类似。是的,您是正确的。我前面的代码有个错误。谢谢你的帮助我已经完成了,但是我修改了列表中的一些字符串,现在得到了分组的\u tuple.append(tuple(new\u tuple))TypeError:'str'对象不可调用。我已经对列表的每个元组进行了三次检查,它们的长度与以前完全相同,所以我不知道是什么导致了这种情况。有什么想法吗?我怎样才能把代码列表转换成带花括号的格式?@david_10001:我不确定我是否理解这个问题。如果你有一个列表
['1321','0A3B','9K44']
并且想要一个集合:你可以写
set(['1321','0A3B','9K44'])
或者直接
{'1321','0A3B','9K44'}
是的,我试过使用set(code\u列表)然后打印(code\u列表),打印出来的结果和以前一样。@david u\u 10001:Yes。唯一的区别是,检查字符串是否在集合中要比检查列表中快得多。我已经使用了上面的代码,但仍然看到每个元组的索引号。我注意到您在示例的输出中也有这样的内容。我正在尝试从列表中删除它们。