Python 按值将名称列表分组为N个列表
如果您得到一个名称列表,其中包含要分组的特定键(DAY-VARIABLE-DIRECTION),例如:Python 按值将名称列表分组为N个列表,python,dictionary,Python,Dictionary,如果您得到一个名称列表,其中包含要分组的特定键(DAY-VARIABLE-DIRECTION),例如: fileList: ['26.cloud_in.des.11.tif', '26.cloud_in.des.14.tif', '26.cloud_in.des.2.tif', '26.cloud_in.des.5.tif', '26.cloud_in.des.8.tif', '26.LST.asc.16.tif', '26.LST.des.1.tif', '26.LST.des.10.tif'
fileList: ['26.cloud_in.des.11.tif', '26.cloud_in.des.14.tif', '26.cloud_in.des.2.tif', '26.cloud_in.des.5.tif', '26.cloud_in.des.8.tif', '26.LST.asc.16.tif', '26.LST.des.1.tif', '26.LST.des.10.tif', '26.LST.des.13.tif', '26.LST.des.4.tif', '26.LST.des.7.tif', '26.NDVI.des.12.tif', '26.NDVI.des.15.tif', '26.NDVI.des.3.tif', '26.NDVI.des.6.tif', '26.NDVI.des.9.tif']
您可以使用N个键作为字典的键,并将列表作为值
这是我的代码:
groupResult = {}
for file in filesList:
day = file.split('.')[0]
prod = file.split('.')[1]
oDir = file.split('.')[2]
key = day+"-"+prod+"-"+oDir
if key in groupResult:
currList = groupResult[key]
currList.append(file)
groupResult[key] = currList
else:
groupResult[key] = [file]
结果是:
groupResult: {'26-cloud_in-des': ['26.cloud_in.des.11.tif', '26.cloud_in.des.14.tif', '26.cloud_in.des.2.tif', '26.cloud_in.des.5.tif', '26.cloud_in.des.8.tif'], '26-LST-asc': ['26.LST.asc.16.tif'], '26-LST-des': ['26.LST.des.1.tif', '26.LST.des.10.tif', '26.LST.des.13.tif', '26.LST.des.4.tif', '26.LST.des.7.tif'], '26-NDVI-des': ['26.NDVI.des.12.tif', '26.NDVI.des.15.tif', '26.NDVI.des.3.tif', '26.NDVI.des.6.tif', '26.NDVI.des.9.tif']}
这是最好的处理方法吗?尝试使用
setdefault
:
groupResult = {}
for file in fileList:
groupResult.setdefault(file.rsplit('.', 2)[0].replace('.', '-'), []).append(file)
或者使用defaultdict
:
from collections import defaultdict
fileList = ['26.cloud_in.des.11.tif', '26.cloud_in.des.14.tif', '26.cloud_in.des.2.tif', '26.cloud_in.des.5.tif', '26.cloud_in.des.8.tif', '26.LST.asc.16.tif', '26.LST.des.1.tif', '26.LST.des.10.tif', '26.LST.des.13.tif', '26.LST.des.4.tif', '26.LST.des.7.tif', '26.NDVI.des.12.tif', '26.NDVI.des.15.tif', '26.NDVI.des.3.tif', '26.NDVI.des.6.tif', '26.NDVI.des.9.tif']
groupResult = defaultdict(list)
for file in fileList:
groupResult[file.rsplit('.', 2)[0].replace('.', '-')].append(file)
groupResult = dict(groupResult)
现在这两种情况都发生了:
print(groupResult)
输出:
{'26-cloud_in-des': ['26.cloud_in.des.11.tif', '26.cloud_in.des.14.tif', '26.cloud_in.des.2.tif', '26.cloud_in.des.5.tif', '26.cloud_in.des.8.tif'], '26-LST-asc': ['26.LST.asc.16.tif'], '26-LST-des': ['26.LST.des.1.tif', '26.LST.des.10.tif', '26.LST.des.13.tif', '26.LST.des.4.tif', '26.LST.des.7.tif'], '26-NDVI-des': ['26.NDVI.des.12.tif', '26.NDVI.des.15.tif', '26.NDVI.des.3.tif', '26.NDVI.des.6.tif', '26.NDVI.des.9.tif']}
尝试使用
setdefault
:
groupResult = {}
for file in fileList:
groupResult.setdefault(file.rsplit('.', 2)[0].replace('.', '-'), []).append(file)
或者使用defaultdict
:
from collections import defaultdict
fileList = ['26.cloud_in.des.11.tif', '26.cloud_in.des.14.tif', '26.cloud_in.des.2.tif', '26.cloud_in.des.5.tif', '26.cloud_in.des.8.tif', '26.LST.asc.16.tif', '26.LST.des.1.tif', '26.LST.des.10.tif', '26.LST.des.13.tif', '26.LST.des.4.tif', '26.LST.des.7.tif', '26.NDVI.des.12.tif', '26.NDVI.des.15.tif', '26.NDVI.des.3.tif', '26.NDVI.des.6.tif', '26.NDVI.des.9.tif']
groupResult = defaultdict(list)
for file in fileList:
groupResult[file.rsplit('.', 2)[0].replace('.', '-')].append(file)
groupResult = dict(groupResult)
现在这两种情况都发生了:
print(groupResult)
输出:
{'26-cloud_in-des': ['26.cloud_in.des.11.tif', '26.cloud_in.des.14.tif', '26.cloud_in.des.2.tif', '26.cloud_in.des.5.tif', '26.cloud_in.des.8.tif'], '26-LST-asc': ['26.LST.asc.16.tif'], '26-LST-des': ['26.LST.des.1.tif', '26.LST.des.10.tif', '26.LST.des.13.tif', '26.LST.des.4.tif', '26.LST.des.7.tif'], '26-NDVI-des': ['26.NDVI.des.12.tif', '26.NDVI.des.15.tif', '26.NDVI.des.3.tif', '26.NDVI.des.6.tif', '26.NDVI.des.9.tif']}
这是一种使用regex的方法 Ex:
import re
fileList = ['26.cloud_in.des.11.tif', '26.cloud_in.des.14.tif', '26.cloud_in.des.2.tif', '26.cloud_in.des.5.tif', '26.cloud_in.des.8.tif', '26.LST.asc.16.tif', '26.LST.des.1.tif', '26.LST.des.10.tif', '26.LST.des.13.tif', '26.LST.des.4.tif', '26.LST.des.7.tif', '26.NDVI.des.12.tif', '26.NDVI.des.15.tif', '26.NDVI.des.3.tif', '26.NDVI.des.6.tif', '26.NDVI.des.9.tif']
result = {}
for i in fileList:
key = re.match(r"(\d+\.[\w_]+\.[a-z]+)", i).group(1)
result.setdefault(key, []).append(i) #or -->result.setdefault(key.replace(".", "-"), []).append(i)
print(result)
{'26.LST.asc': ['26.LST.asc.16.tif'],
'26.LST.des': ['26.LST.des.1.tif',
'26.LST.des.10.tif',
'26.LST.des.13.tif',
'26.LST.des.4.tif',
'26.LST.des.7.tif'],
'26.NDVI.des': ['26.NDVI.des.12.tif',
'26.NDVI.des.15.tif',
'26.NDVI.des.3.tif',
'26.NDVI.des.6.tif',
'26.NDVI.des.9.tif'],
'26.cloud_in.des': ['26.cloud_in.des.11.tif',
'26.cloud_in.des.14.tif',
'26.cloud_in.des.2.tif',
'26.cloud_in.des.5.tif',
'26.cloud_in.des.8.tif']}
输出:
import re
fileList = ['26.cloud_in.des.11.tif', '26.cloud_in.des.14.tif', '26.cloud_in.des.2.tif', '26.cloud_in.des.5.tif', '26.cloud_in.des.8.tif', '26.LST.asc.16.tif', '26.LST.des.1.tif', '26.LST.des.10.tif', '26.LST.des.13.tif', '26.LST.des.4.tif', '26.LST.des.7.tif', '26.NDVI.des.12.tif', '26.NDVI.des.15.tif', '26.NDVI.des.3.tif', '26.NDVI.des.6.tif', '26.NDVI.des.9.tif']
result = {}
for i in fileList:
key = re.match(r"(\d+\.[\w_]+\.[a-z]+)", i).group(1)
result.setdefault(key, []).append(i) #or -->result.setdefault(key.replace(".", "-"), []).append(i)
print(result)
{'26.LST.asc': ['26.LST.asc.16.tif'],
'26.LST.des': ['26.LST.des.1.tif',
'26.LST.des.10.tif',
'26.LST.des.13.tif',
'26.LST.des.4.tif',
'26.LST.des.7.tif'],
'26.NDVI.des': ['26.NDVI.des.12.tif',
'26.NDVI.des.15.tif',
'26.NDVI.des.3.tif',
'26.NDVI.des.6.tif',
'26.NDVI.des.9.tif'],
'26.cloud_in.des': ['26.cloud_in.des.11.tif',
'26.cloud_in.des.14.tif',
'26.cloud_in.des.2.tif',
'26.cloud_in.des.5.tif',
'26.cloud_in.des.8.tif']}
这是一种使用regex的方法 Ex:
import re
fileList = ['26.cloud_in.des.11.tif', '26.cloud_in.des.14.tif', '26.cloud_in.des.2.tif', '26.cloud_in.des.5.tif', '26.cloud_in.des.8.tif', '26.LST.asc.16.tif', '26.LST.des.1.tif', '26.LST.des.10.tif', '26.LST.des.13.tif', '26.LST.des.4.tif', '26.LST.des.7.tif', '26.NDVI.des.12.tif', '26.NDVI.des.15.tif', '26.NDVI.des.3.tif', '26.NDVI.des.6.tif', '26.NDVI.des.9.tif']
result = {}
for i in fileList:
key = re.match(r"(\d+\.[\w_]+\.[a-z]+)", i).group(1)
result.setdefault(key, []).append(i) #or -->result.setdefault(key.replace(".", "-"), []).append(i)
print(result)
{'26.LST.asc': ['26.LST.asc.16.tif'],
'26.LST.des': ['26.LST.des.1.tif',
'26.LST.des.10.tif',
'26.LST.des.13.tif',
'26.LST.des.4.tif',
'26.LST.des.7.tif'],
'26.NDVI.des': ['26.NDVI.des.12.tif',
'26.NDVI.des.15.tif',
'26.NDVI.des.3.tif',
'26.NDVI.des.6.tif',
'26.NDVI.des.9.tif'],
'26.cloud_in.des': ['26.cloud_in.des.11.tif',
'26.cloud_in.des.14.tif',
'26.cloud_in.des.2.tif',
'26.cloud_in.des.5.tif',
'26.cloud_in.des.8.tif']}
输出:
import re
fileList = ['26.cloud_in.des.11.tif', '26.cloud_in.des.14.tif', '26.cloud_in.des.2.tif', '26.cloud_in.des.5.tif', '26.cloud_in.des.8.tif', '26.LST.asc.16.tif', '26.LST.des.1.tif', '26.LST.des.10.tif', '26.LST.des.13.tif', '26.LST.des.4.tif', '26.LST.des.7.tif', '26.NDVI.des.12.tif', '26.NDVI.des.15.tif', '26.NDVI.des.3.tif', '26.NDVI.des.6.tif', '26.NDVI.des.9.tif']
result = {}
for i in fileList:
key = re.match(r"(\d+\.[\w_]+\.[a-z]+)", i).group(1)
result.setdefault(key, []).append(i) #or -->result.setdefault(key.replace(".", "-"), []).append(i)
print(result)
{'26.LST.asc': ['26.LST.asc.16.tif'],
'26.LST.des': ['26.LST.des.1.tif',
'26.LST.des.10.tif',
'26.LST.des.13.tif',
'26.LST.des.4.tif',
'26.LST.des.7.tif'],
'26.NDVI.des': ['26.NDVI.des.12.tif',
'26.NDVI.des.15.tif',
'26.NDVI.des.3.tif',
'26.NDVI.des.6.tif',
'26.NDVI.des.9.tif'],
'26.cloud_in.des': ['26.cloud_in.des.11.tif',
'26.cloud_in.des.14.tif',
'26.cloud_in.des.2.tif',
'26.cloud_in.des.5.tif',
'26.cloud_in.des.8.tif']}
您可以尝试
itertools.groupby
:
>>> from itertools import groupby
>>> groupResult = {}
>>> for k, g in groupby(fileList, lambda x: x.rsplit('.',2)[0]):
... k = k.replace('.','-')
... groupResult[k] = list(g)
{'26-cloud_in-des': ['26.cloud_in.des.11.tif',
'26.cloud_in.des.14.tif',
'26.cloud_in.des.2.tif',
'26.cloud_in.des.5.tif',
'26.cloud_in.des.8.tif'],
'26-LST-asc': ['26.LST.asc.16.tif'],
'26-LST-des': ['26.LST.des.1.tif',
'26.LST.des.10.tif',
'26.LST.des.13.tif',
'26.LST.des.4.tif',
'26.LST.des.7.tif'],
'26-NDVI-des': ['26.NDVI.des.12.tif',
'26.NDVI.des.15.tif',
'26.NDVI.des.3.tif',
'26.NDVI.des.6.tif',
'26.NDVI.des.9.tif']}
或者
您可以尝试
itertools.groupby
:
>>> from itertools import groupby
>>> groupResult = {}
>>> for k, g in groupby(fileList, lambda x: x.rsplit('.',2)[0]):
... k = k.replace('.','-')
... groupResult[k] = list(g)
{'26-cloud_in-des': ['26.cloud_in.des.11.tif',
'26.cloud_in.des.14.tif',
'26.cloud_in.des.2.tif',
'26.cloud_in.des.5.tif',
'26.cloud_in.des.8.tif'],
'26-LST-asc': ['26.LST.asc.16.tif'],
'26-LST-des': ['26.LST.des.1.tif',
'26.LST.des.10.tif',
'26.LST.des.13.tif',
'26.LST.des.4.tif',
'26.LST.des.7.tif'],
'26-NDVI-des': ['26.NDVI.des.12.tif',
'26.NDVI.des.15.tif',
'26.NDVI.des.3.tif',
'26.NDVI.des.6.tif',
'26.NDVI.des.9.tif']}
或者
你可以用。这允许您设置并使用给定键的默认值(如果该键在字典中不存在)
替换:
if key in groupResult:
currList = groupResult[key]
currList.append(file)
groupResult[key] = currList
else:
groupResult[key] = [file]
与:
或者您可以使用Python的模块。defaultdict
类似于dict
,但在请求时会自动为不存在的键创建一个值:
from collections import defaultdict
groupResult = defaultdict(list)
# etc
groupResult[key].append(file)
你可以用。这允许您设置并使用给定键的默认值(如果该键在字典中不存在)
替换:
if key in groupResult:
currList = groupResult[key]
currList.append(file)
groupResult[key] = currList
else:
groupResult[key] = [file]
与:
或者您可以使用Python的模块。defaultdict
类似于dict
,但在请求时会自动为不存在的键创建一个值:
from collections import defaultdict
groupResult = defaultdict(list)
# etc
groupResult[key].append(file)
我认为这属于我认为这属于我会更具可读性。会更具可读性。@PeterWood是的。我在上面的评论中补充了这一点snippet@PeterWood对我在上面的片段中添加了这一点作为评论