[英]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.