Python 按值将名称列表分组为N个列表

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'

如果您得到一个名称列表,其中包含要分组的特定键(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', '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对我在上面的片段中添加了这一点作为评论