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

时间:2017-02-08 12:58:55

标签: python

我有一个清单:

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

我希望将每个子列表中的'act...''bac...''cob...'的第一个实例放入另一个列表中以获取:

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

我怎样才能在Python中执行此操作?

3 个答案:

答案 0 :(得分:0)

此功能应该有效:

request.execute(
        new ResultListener<List<com.here.android.mpa.search.Location>>() {
            @Override
            public void onCompleted(List<Location> locations, ErrorCode errorCode) {

            }
        //...
        }

使用它:

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

答案 1 :(得分:0)

您可以使用前三个字母的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中不存在密钥的值。如果密钥已存在,则不会更改dict,因此会保留第一个值集。

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

from itertools import groupby

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

答案 2 :(得分:0)

您可以使用列表理解:

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]

如果尚未添加此类元素,则仅将元素添加到新构建的子列表中。