Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用重复模式提取子列表元素的第一个实例?_Python - Fatal编程技术网

Python 如何使用重复模式提取子列表元素的第一个实例?

Python 如何使用重复模式提取子列表元素的第一个实例?,python,Python,我有一份清单: l = [['act137L', 'act222J1', 'act45k', 'bac003', 'bac19004', 'cob55C37'], ['act3947', 'act658ll', 'act3FjL', 'bac57D73', 'cob00091', 'cob1A4']] 我想将每个子列表中的'act…'、'bac…'和'cob…'的第一个实例放入另一个列表中,以获得: l2 = [['act137L', 'bac003', 'cob55C37'], [

我有一份清单:

l = [['act137L', 'act222J1', 'act45k', 'bac003', 'bac19004', 'cob55C37'],
     ['act3947', 'act658ll', 'act3FjL', 'bac57D73', 'cob00091', 'cob1A4']]
我想将每个子列表中的
'act…'
'bac…'
'cob…'
的第一个实例放入另一个列表中,以获得:

l2 = [['act137L', 'bac003', 'cob55C37'], ['act3947', 'bac57D73', 'cob00091']]  

如何在Python中执行此操作?

此函数应该可以工作:

def get_firsts(the_lists, terms):
    ret_lists = []
    for a_list in the_lists:
        new_list = []
        rest_terms = terms[:]
        while rest_terms:
            for val in a_list:
                for term in rest_terms[:]:
                    if val.startswith(term):
                        new_list.append(val)
                        rest_terms.remove(term)
        ret_lists.append(new_list)
    return ret_lists
按如下方式使用:

>>> get_firsts(l, ['act','bac','cob'])
[['act137L', 'bac003', 'cob55C37'], ['act3947', 'bac57D73', 'cob00091']]
您可以使用前三个字母作为键来收集值:

from collections import OrderedDict

l = [['act137L', 'act222J1', 'act45k', 'bac003', 'bac19004', 'cob55C37'],
     ['act3947', 'act658ll', 'act3FjL', 'bac57D73', 'cob00091', 'cob1A4']]

def first_items(l):
    res = []
    for sublist in l:
        d = OrderedDict()
        for x in sublist:
            d.setdefault(x[:3], x)
        res.append(list(d.values()))

    return res

print(first_items(l))
输出:

[['act137L', 'bac003', 'cob55C37'], ['act3947', 'bac57D73', 'cob00091']]
在上述中,如果
dict
中不存在键,则设置该值。如果键已存在,则不会更改
dict
,因此保留第一个值集

如果您知道具有相同前缀的项目在列表中始终相邻,则可以使用:


您可以使用列表:

l2 = [[j[i] for i in range(len(j)) if j[i][:3] not in ''.join(k for k in j[:i])] for j in l]

如果尚未添加任何元素,则只会将元素添加到新构造的子列表。

此解决方案无法按发布的方式工作。它在删除while语句时起作用。非常感谢。
l2 = [[j[i] for i in range(len(j)) if j[i][:3] not in ''.join(k for k in j[:i])] for j in l]