繁体   English   中英

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

[英]How to extract the first instance of a sublist element using a repeated pattern?

我有一个清单:

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

您可以使用前三个字母作为键的OrderedDict来收集值:

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

在上述setdefault中,如果dict不存在key,则设置该值。 如果键已经存在,则不会更改dict因此将保留第一个值集。

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

from itertools import groupby

res = [[next(g) for _, g in groupby(sublist, lambda x: x[:3])] for sublist in l]

您可以使用列表推导:

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]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM