如何比较两个列表以保持匹配的子字符串,以及如何保持基于子字符串的顺序?

2024-10-02 12:23:15 发布

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

有一个类似的问题,张贴在其他线程,但我想有一个不同的输出 如何比较两个列表以保持匹配的子字符串

列表A的模式并不一致

A = ['dataFile1999', 'dataFile::2000', 'Resultx2001', 'Filter2002']
B = ['2000', '1999', '1998', '2005', '2002','2005']

C = [x for x in A if any(b in x for b in B)]

print(C)

输出:

['dataFile::2000', 'dataFile1999','Filter2002']

但我希望输出的顺序与子字符串列表B相同 此外,如果缺少任何字符串,则仍应将该字符串保留在列表中

['dataFile::2000','dataFile1999','1998','2005','Filter2002','2005']

Tags: 字符串in列表forif顺序模式any
3条回答

复杂的一行,只是为了好玩;) 没有关于模式的假设

[filter(lambda a : b in a, A).__next__() if any(b in a for a in A) else b for b in B]

['dataFile2000', 'dataFile1999', '1998', '2005', 'dataFile2002', '2005']

或者没有filter

[[a for a in A if b in a][0] if any(b in a for a in A) else b for b in B]

['dataFile2000', 'dataFile1999', '1998', '2005', 'dataFile2002', '2005']

这将是一个等效的扩展代码:

l=list()
for b in B:
    if any(b in a for a in A):
        for a in A:
            if b in a:
                l.append(a)
    else:
        l.append(b)
        
print(l)

这是一个更有效的版本:

l=list()
for b in B:
    this_element = b
    for a in A:
        if b in a:
            this_element = a
            break
    l.append(this_element)

print(l)

也许可以添加另一个列表,该列表获取B中不在C中的所有项,然后将结果添加到另一个列表中

    D = [x for x in B if not any(x in c for c in C)]
    result = C.extend(D)

由于列表A有一个一致的模式,这些模式应该可以很好地工作:

C = ['dataFile'+b if 'dataFile'+b in A  else b for b in B]

输出:

>>> C
['dataFile2000', 'dataFile1999', '1998', '2005', 'dataFile2002', '2005']

C = ['dataFile'+b if b in ''.join(A)  else b for b in B]

输出:

>>> C
['dataFile2000', 'dataFile1999', '1998', '2005', 'dataFile2002', '2005']

编辑

正如OP所提到的,列表A的前缀可以是一致的,因此:

C = [i[0] for i in [[a for a in A if b in a] or [b] for b in B]]

输出:

['dataFile2000', 'dataFile1999', '1998', '2005', 'dataFile2002', '2005']

相关问题 更多 >

    热门问题