用部分相似的字符串匹配列表中的元素| Python 3.x

时间:2018-12-18 13:18:51

标签: python python-3.x list

我有两个列表,其中包含来自不同目录的文件名。

目标是将目标目录中的文件名同步到源目录中的文件名。由于文件名包含部分相同的字符串,因此应该可以引用它们。


目录1:“ random-original.ext” |目录2:“ original.ext”

与skript同步:

目录1:“ random-original.ext” |目录2:“ random-original.ext”


此处的“ S03-ST02 ...”只是随机字符串的示例。两个文件中唯一相同的是文件扩展名之前(包括文件扩展名)的最后一部分。以下文件名仅是示例-之后应该可以使用所有名称。

输入:

sourceFiles  = [S03-ST02-T04-VID004.mov, S01-ST01-T01-AV0203.abc, S05-ST02-T01-MOV0014.mp4]
targetFiles  = [AV0203.abc, MOV0014.mp4, VID0004.mov]

输出变量1

sourceFiles = [S01-ST01-T01-AV0203.abc, S05-ST02-T01-MOV0014.mp4, S03-ST02-T04-VID0004.mov]
targetFiles  = [AV0203.abc, MOV0014.mp4, VID0004.mov]

因此,我可以使用for循环来引用相同的文件(名称不同):

for i in len(sourceFiles):
   sourceFiles[i]
   targetFiles[i]

输出变量2

combFileList = [(S01-ST01-T01-AV0203.abc, AV0203.abc), (S05-ST02-T01-MOV0014.mp4, MOV0014.mp4), (S03-ST02-T04-VID0004.mov, VID0004.mov)]

并引用相同的文件,例如:

for i in len(combFileList):
   combFileList[i][0]
   combFileList[i][1]
   ...

我将如何处理?

2 个答案:

答案 0 :(得分:1)

您可以在列表理解内使用next

sourceFiles  = ['S03-ST02-T04-VID0004.mov', 'S01-ST01-T01-AV0203.abc', 'S05-ST02-T01-MOV0014.mp4']
targetFiles  = ['AV0203.abc', 'MOV0014.mp4', 'VID0004.mov']

res = [next((x for x in targetFiles if y.endswith(x)), 'N/A') for y in sourceFiles]

产生

print(res)  # -> ['VID0004.mov', 'AV0203.abc', 'MOV0014.mp4']

答案 1 :(得分:0)

类似这样的东西

for targetFile in targetFiles:
    for sourceFile in sourceFiles:
        if sourceFile.endswith(targetFile):
            do_something(sourceFile, targetFile)