Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用for循环从列表构建字典_Python_For Loop - Fatal编程技术网

在Python中使用for循环从列表构建字典

在Python中使用for循环从列表构建字典,python,for-loop,Python,For Loop,我在一个目录中有多个格式文件。我正在尝试使用for循环构建一个列表或字典,以便在python中对类似的格式化(扩展名)文件进行分组,但不知何故,它不起作用 以下是我的示例代码: extension = ['pdf','xlsx','doc'] file_name_path=[] file_dict ={} for i in range(len(extension)): for file_name in filelst: if os.path.splitext(file_

我在一个目录中有多个格式文件。我正在尝试使用for循环构建一个列表或字典,以便在python中对类似的格式化(扩展名)文件进行分组,但不知何故,它不起作用

以下是我的示例代码:

extension = ['pdf','xlsx','doc']

file_name_path=[]
file_dict ={}
for i in range(len(extension)):
    for file_name in filelst:
        if os.path.splitext(file_name)[-1] == extension[i]:
            file_name_path.append(file_name)
            file_dict[str(extension[i])]= file_name_path


file_name_path   
file_dict
其中filelst是一个包含所有文件名的列表,例如

filelst = 
['PD_CFS_PLL_OnMonSummary_2017Q2.xlsx',
 'PD_Detailed_OMR_PLL_Lines_2017Q2.xlsx',
 'PD_Detailed_OMR_PLL_Loans_2017Q2.xlsx',
 'regexp-tip-sheet.pdf',
 'SAS statistical-business-analyst certification .pdf']

每次看到同一个键时,都会覆盖字典值

相反,使用列表作为值并追加。这就是
defaultdict
的用途

从集合导入defaultdict

extension = ['pdf','xlsx','doc']

file_dict = defaultdict(list)

for file_name in filelst:
    ext = os.path.splitext(file_name)[-1].lower()
    if ext in extension:
        file_dict[ext].append(file_name)

每次看到同一个键时,都会覆盖字典值

相反,使用列表作为值并追加。这就是
defaultdict
的用途

从集合导入defaultdict

extension = ['pdf','xlsx','doc']

file_dict = defaultdict(list)

for file_name in filelst:
    ext = os.path.splitext(file_name)[-1].lower()
    if ext in extension:
        file_dict[ext].append(file_name)

获取以扩展名作为键的字典的替代方法

extension = ['.pdf','.xlsx','.doc']
filelist = ['one.pdf','two.pdf','three.doc','four.xlsx'] #just for example
d = dict()
for i in extension:
    d[i] = [j for j in filelist if os.path.splitext(j)[-1].lower()==i]
print(d)
输出:

{'.doc': ['three.doc'], '.xlsx': ['four.xlsx'], '.pdf': ['one.pdf', 'two.pdf']}

注意,我在扩展列表中使用了点作为
os.path.splitext
返回列表,最后一个元素是
'.extension'
.lower()
用于使此解决方案不区分大小写,扩展名列表中的字符串只能包含小写字符。

获取以扩展名为键的字典的替代方法

extension = ['.pdf','.xlsx','.doc']
filelist = ['one.pdf','two.pdf','three.doc','four.xlsx'] #just for example
d = dict()
for i in extension:
    d[i] = [j for j in filelist if os.path.splitext(j)[-1].lower()==i]
print(d)
输出:

{'.doc': ['three.doc'], '.xlsx': ['four.xlsx'], '.pdf': ['one.pdf', 'two.pdf']}

注意,我在扩展列表中使用了点作为
os.path.splitext
返回列表,最后一个元素是
'.extension'
.lower()
用于使此解决方案不区分大小写,扩展名列表中的字符串只能包含小写字符。

您所说的“不工作”到底是什么意思?它实际上不打印或输出任何内容,如果这是您的意思的话。您的
i
在哪里?另外,请查看
endswith
内置方法my bad。我刚刚编辑了代码。你说的“不工作”到底是什么意思?它实际上不打印或输出任何内容,如果这是您的意思的话。您的
i
在哪里?另外,请查看
endswith
内置方法my bad。我刚刚编辑了代码。我喜欢你的方法。谢谢,成功了。我是Python新手,如果可能的话,请您解释一下print语句前一行for循环后的逻辑。这就是所谓的列表理解,有关解释请参阅本教程:我喜欢您的方法。谢谢,成功了。我是Python新手,如果可能的话,请您向我解释for loop in line BEFOR print语句后的逻辑。这称为列表理解,有关解释,请参阅本教程: