python方式创建列表字典(字典推导)



我有以下列表:

files = ['AAA_1', 'BBB_2', 'Cfiles', 'AAA_2', 'BBB_4']

我有以下字典:

dict = {
'AAA' : [],
'BBB': [],
'CCC' : []
}

我的期望输出是:

dict = {
'AAA' : ['AAA_1', 'AAA_2'],
'BBB': ['BBB_2', 'BBB_4'],
'CCC' : ['CCC_1']
}

我可以使用:

for file in files:
if file.startswith(file[:-2]):
dict[file[:-2]].append(file)

如果我使用:

dict = {file[:-2]: [file] for file in files if file.startswith(file[:-2])}

我:

{'AAA': ['AAA_2'], 'BBB': ['BBB_4'], 'CCC': ['CCC_1']}

我的疑问是:如何在使用字典理解的列表字典中添加值?

我不建议使用字典推导式,因为简单的for循环结构更具可读性。但如果你一定要一个,给你:

sorted_files = {f[:-2] : [file for file in files if file.startswith(f[:-2])] for f in files}

同样,我不建议使用Python关键字作为变量名。这是不好的做法,有时你可能会混淆程序。

输出:

{'AAA': ['AAA_1', 'AAA_2'], 'BBB': ['BBB_2', 'BBB_4'], 'CCC': ['CCC_1']}

您可以使用两个嵌套的推导式来实现:

dict = {key: [file for file in files if file[:-2] == key] for key in dict}

如果您希望完全使用推导式来完成此操作,则需要一个内部列表推导式来构建给定前缀的整个列表,并且您可能需要另一个推导式来构建前缀/键集(尽管这不是严格必要的,因为您可以多次重新生成每个条目,并且它只会覆盖自己):

>>> files = ['AAA_1', 'BBB_2', 'CCC_1', 'AAA_2', 'BBB_4']
>>> {k: [f for f in files if f.startswith(k)] for k in {f[:3] for f in files}}
{'BBB': ['BBB_2', 'BBB_4'], 'AAA': ['AAA_1', 'AAA_2'], 'CCC': ['CCC_1']}

注意,除了不太清晰之外,它的效率也较低,因为您需要为每个条目遍历整个CC_1。我将使用在files上迭代一次的循环。

你只需要使用嵌套推导式:

dict_ = {
file_group[:-2]: [file for file in files if file.startswith(file_group[:-2])] for file_group in files}

最新更新