gpt4 book ai didi

Python:在列表中查找具有匹配扩展名的文件或具有匹配名称的扩展名

转载 作者:行者123 更新时间:2023-12-01 06:16:21 25 4
gpt4 key购买 nike

假设我有一个文件名列表:[exia.gundam、dynames.gundam、kyrios.gundam、virtual.gundam][exia.frame、exia.head、exia .swords、exia.legs、exia.arms、exia.pilot、exia.gn_drive、lockon_stratos.data、tieria_erde.data、ribbons_almark.data、otherstuff.dada]

在一次迭代中,我希望拥有所有 *.gundam 或 *.data 文件,而在另一次迭代中,我希望对 exia.* 文件进行分组。除了迭代列表并将每个元素放入字典之外,最简单的方法是什么?

这就是我的想法:

def matching_names(files):
'''
extracts files with repeated names from a list

Keyword arguments:
files - list of filenames

Returns: Dictionary
'''

nameDict = {}
for file in files:
filename = file.partition('.')
if filename[0] not in nameDict:
nameDict[filename[0]] = []
nameDict[filename[0]].append(filename[2])

matchingDict = {}
for key in nameDict.keys():
if len(nameDict[key]) > 1:
matchingDict[key] = nameDict[key]
return matchingDict

好吧,假设我必须使用它,有没有一种简单的方法可以反转它并将文件扩展名作为键而不是名称?

最佳答案

在我的第一个版本中,看起来我误解了你的问题。因此,如果我的理解正确,那么您正在尝试处理文件列表,以便您可以轻松访问具有给定扩展名的所有文件名,或具有给定基数的所有文件名(“基数”是之前的部分)期)?

如果是这样的话,我会推荐这样:

from itertools import groupby

def group_by_name(filenames):
'''Puts the filenames in the given iterable into a dictionary where
the key is the first component of the filename and the value is
a list of the filenames with that component.'''
keyfunc = lambda f: f.split('.', 1)[0]
return dict( (k, list(g)) for k,g in groupby(
sorted(filenames, key=keyfunc), key=keyfunc
) )

例如,给定列表

>>> test_data = [
... exia.frame, exia.head, exia.swords, exia.legs,
... exia.arms, exia.pilot, exia.gn_drive, lockon_stratos.data,
... tieria_erde.data, ribbons_almark.data, otherstuff.dada
... ]

该函数会产生

>>> group_by_name(test_data)
{'exia': ['exia.arms', 'exia.frame', 'exia.gn_drive', 'exia.head',
'exia.legs', 'exia.pilot', 'exia.swords'],
'lockon_stratos': ['lockon_stratos.data'],
'otherstuff': ['otherstuff.dada'],
'ribbons_almark': ['ribbons_almark.data'],
'tieria_erde': ['tieria_erde.data']}

如果您想按扩展名对文件名建立索引,只需稍加修改即可:

def group_by_extension(filenames):
'''Puts the filenames in the given iterable into a dictionary where
the key is the last component of the filename and the value is
a list of the filenames with that extension.'''
keyfunc = lambda f: f.split('.', 1)[1]
return dict( (k, list(g)) for k,g in groupby(
sorted(filenames, key=keyfunc), key=keyfunc
) )

唯一的区别在于 keyfunc = ... 行,我将 key 从 0 更改为 1。示例:

>>> group_by_extension(test_data)
{'arms': ['exia.arms'],
'dada': ['otherstuff.dada'],
'data': ['lockon_stratos.data', 'ribbons_almark.data', 'tieria_erde.data'],
'frame': ['exia.frame'],
'gn_drive': ['exia.gn_drive'],
'head': ['exia.head'],
'legs': ['exia.legs'],
'pilot': ['exia.pilot'],
'swords': ['exia.swords']}

如果你想同时获得这两个分组,我认为最好避免列表理解,因为这只能以一种或另一种方式处理它们,它不能构造两个不同的字典立刻。

from collections import defaultdict
def group_by_both(filenames):
'''Puts the filenames in the given iterable into two dictionaries,
where in the first, the key is the first component of the filename,
and in the second, the key is the last component of the filename.
The values in each dictionary are lists of the filenames with that
base or extension.'''
by_name = defaultdict(list)
by_ext = defaultdict(list)
for f in filenames:
name, ext = f.split('.', 1)
by_name[name] += [f]
by_ext[ext] += [f]
return by_name, by_ext

关于Python:在列表中查找具有匹配扩展名的文件或具有匹配名称的扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3173652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com