簡體   English   中英

如何比較兩個列表以保持匹配的子字符串以及如何保留基於 substring 的順序?

[英]How to compare two lists to keep matching substrings and also how to retain the order based on substring?

有一個類似的問題,發布在其他線程中,但我想要一個不同的 output 如何比較兩個列表以保持匹配的子字符串?

並且列表 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)

Output:

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

但是我希望 output 的順序與 substring 列表 B 的順序相同,如果缺少任何字符串 - 它仍應將字符串保留在列表中。

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

一個復雜的單線,只是為了好玩;)對模式沒有假設。

[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)

由於您的列表 A 具有一致的模式,因此這些應該可以正常工作:

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

Output:

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

或者

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

Output:

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

Output:

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

也許添加另一個列表理解來獲取不在 C 中的 B 的所有項目,然后將結果添加到另一個列表

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

您可以創建C的副本,並通過匹配來自A的值替換其值,否則保留來自C的原始值:

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

for i, y in enumerate(B):
    _value = y  # Use as default if not matching value found!
    for f in A:
        if f.endswith(y):
            C[i] = f
            break
print(C)

出去:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM