Python 将文件夹中的一张图片与多张图片配对

Python 将文件夹中的一张图片与多张图片配对,python,pandas,for-loop,if-statement,python-pptx,Python,Pandas,For Loop,If Statement,Python Pptx,我想配对的文件夹中有一些图片,因此我可以以迭代方式将它们添加到幻灯片中。我想将以mp结尾的图片与bp结尾的图片配对。一个警告是,有多个图片以bp和bp结尾,因此添加逻辑检查是可行的 假设文件夹中有一张照片 我想将1\u birds\u bp.png与其他图片配对,以1开头,以mp结尾 所以这对应该看起来像#预期的结果 ('D:\\test\\1_birds_bp.png', 'D:\\test\\1_eagle_mp.png') ('D:\\test\\1_birds_bp.png', 'D:

我想配对的文件夹中有一些图片,因此我可以以迭代方式将它们添加到幻灯片中。我想将以
mp
结尾的图片与
bp
结尾的图片配对。一个警告是,有多个图片以
bp
bp
结尾,因此添加逻辑检查是可行的

假设文件夹中有一张照片

我想将
1\u birds\u bp.png
与其他图片配对,以
1
开头,以
mp
结尾

所以这对应该看起来像#预期的结果

('D:\\test\\1_birds_bp.png', 'D:\\test\\1_eagle_mp.png')
('D:\\test\\1_birds_bp.png', 'D:\\test\\1_hawk_mp.png')
('D:\\test\\1_birds_bp.png', 'D:\\test\\1_owl_mp.png')
对于
爬行动物组

('D:\\test\\2_reptile_bp.png', 'D:\\test\\2_crocodile_mp.png')
('D:\\test\\2_reptile_bp.png', 'D:\\test\\2_snake_mp.png')
所以按照这个 我试过了

但我只能配对

('D:\\test\\1_birds_bp.png', 'D:\\test\\1_eagle_mp.png')
('D:\\test\\2_reptile_bp.png', 'D:\\test\\1_hawk_mp.png')

如何实现这一点?

您可以检查所有组合并选择匹配的组合:

from itertools import combinations
from pathlib import Path
files = Path(folder).glob('*.png')
list_of_pairs = [(a, b) for a, b in combinations(files, 2)
                 if (a.name.startswith(b.name[0]) and (('mp' in a.name and 'bp' in b.name) or ('bp' in a.name and 'mp' in b.name))]

更好的是,使用
itertools.combines上的
filter
进行自定义成对检查。

您可以检查所有组合并选择匹配的组合:

from itertools import combinations
from pathlib import Path
files = Path(folder).glob('*.png')
list_of_pairs = [(a, b) for a, b in combinations(files, 2)
                 if (a.name.startswith(b.name[0]) and (('mp' in a.name and 'bp' in b.name) or ('bp' in a.name and 'mp' in b.name))]

更好的是,在
itertools.compositions
上使用
filter
进行自定义成对检查。

我喜欢@xletmjm的方法,尽管
pathlib
仅在Python>=3.4中可用

这里有一种替代方法,适用于您目前使用的方法

import glob

class Path(object):
    def __init__(self, path):
        self._path = path

    @property
    def stem(self):
        """The "base" part of the filename, without the extension."""
        return ".".join(self.filename.split(".")[:-1])

    @property
    def filename(self):
        return self._path.split("/")[-1]

    @property
    def filename_prefix(self):
        return self.stem.split("_")[0]

    @property
    def filename_suffix(self):
        return self.stem.split("_")[-1]

    @property
    def path(self):
        return self._path


def iter_bp_paths(paths):
    """Generate each Path object in `paths` with filename having "_bp" suffix."""
    return (p for p in paths if p.filename_suffix == "bp")


def iter_mp_paths(paths, prefix):
    """Generate each Path object in `paths` with `prefix` and "mp" suffix."""
    return (
        p for p in paths if p.filename_prefix == prefix and p.filename_suffix == "mp"
    )


if __name__ == "__main__":
    paths = [Path(path) for path in glob.glob("/Users/you/tmp/*.png")]
    for bp_path in iter_bp_paths(paths):
        for mp_path in iter_mp_paths(paths, bp_path.filename_prefix):
            print(bp_path.path, mp_path.path)


我喜欢@xletmjm的方法,尽管
pathlib
仅在Python>=3.4中可用

这里有一种替代方法,适用于您目前使用的方法

import glob

class Path(object):
    def __init__(self, path):
        self._path = path

    @property
    def stem(self):
        """The "base" part of the filename, without the extension."""
        return ".".join(self.filename.split(".")[:-1])

    @property
    def filename(self):
        return self._path.split("/")[-1]

    @property
    def filename_prefix(self):
        return self.stem.split("_")[0]

    @property
    def filename_suffix(self):
        return self.stem.split("_")[-1]

    @property
    def path(self):
        return self._path


def iter_bp_paths(paths):
    """Generate each Path object in `paths` with filename having "_bp" suffix."""
    return (p for p in paths if p.filename_suffix == "bp")


def iter_mp_paths(paths, prefix):
    """Generate each Path object in `paths` with `prefix` and "mp" suffix."""
    return (
        p for p in paths if p.filename_prefix == prefix and p.filename_suffix == "mp"
    )


if __name__ == "__main__":
    paths = [Path(path) for path in glob.glob("/Users/you/tmp/*.png")]
    for bp_path in iter_bp_paths(paths):
        for mp_path in iter_mp_paths(paths, bp_path.filename_prefix):
            print(bp_path.path, mp_path.path)


谢谢你的解决方案,效果很好。虽然它看起来像中等leetcode问题:)谢谢你的解决方案,它工作得很好。虽然它看起来像是中等水平的leetcode问题:)但可以使用
os.listdir()
代替
Path.iterdir()
。可以使用
os.listdir()
代替
Path.iterdir()