将值列表关联到每个集合元素
associate a list of values to each set element
我正在尝试针对以下问题提出最佳解决方案:
我有一个文件名列表,每个文件名都有一个 ID;这些 ID 不是唯一的,这意味着多个文件名可能与一个 ID 相关联。
所以我可以将我的数据打包为:(ID, [filename1, filename2,...])
问题是我想将 ID 作为一个集合来使用,因为我需要使用这些 ID 的另一个预定义分组来分组和提取差异和交集,并且我需要操作相对较快,因为我拥有大约一百万个 ID。
但我不知道如何在将 ID 视为集合中的一个元素时保持 ID 与文件名列表相关联。这可能与集有关,还是有任何集扩展可以启用此功能?
听起来您的数据类似于下面的示例数据。如果是这样,那么代码将显示如何使用散列 table 来执行您的要求。散列 table 可以是 Python dict
(在 id
上散列为键,文件名 list
作为关联值)或只是一个 set
个 id
元素,如果这是您真正想要的(尽管正如其他人在评论中建议的那样,dict
可能是最佳解决方案)。
files = [
{'filename':'foo101', 'id':1},
{'filename':'foo102', 'id':1},
{'filename':'foo103', 'id':1},
{'filename':'foo201', 'id':2},
{'filename':'foo202', 'id':2},
{'filename':'foo301', 'id':3},
{'filename':'foo401', 'id':4},
]
fileDict = defaultdict(list)
for d in files:
fileDict[d['id']].append(d['filename'])
[print(id, fileNames) for id, fileNames in fileDict.items()]
idSet = set(fileDict)
print(idSet)
示例输出:
1 ['foo101', 'foo102', 'foo103']
2 ['foo201', 'foo202']
3 ['foo301']
4 ['foo401']
{1, 2, 3, 4}
为方便起见,以上代码使用 defaultdict(list)
,但您也可以使用常规 dict
,如下所示:
files = [
{'filename':'foo101', 'id':1},
{'filename':'foo102', 'id':1},
{'filename':'foo103', 'id':1},
{'filename':'foo201', 'id':2},
{'filename':'foo202', 'id':2},
{'filename':'foo301', 'id':3},
{'filename':'foo401', 'id':4},
]
fileDict = {}
for d in files:
if d['id'] not in fileDict:
fileDict[d['id']] = []
fileDict[d['id']].append(d['filename'])
[print(id, fileNames) for id, fileNames in fileDict.items()]
idSet = set(fileDict)
print(idSet)
我正在尝试针对以下问题提出最佳解决方案:
我有一个文件名列表,每个文件名都有一个 ID;这些 ID 不是唯一的,这意味着多个文件名可能与一个 ID 相关联。
所以我可以将我的数据打包为:(ID, [filename1, filename2,...])
问题是我想将 ID 作为一个集合来使用,因为我需要使用这些 ID 的另一个预定义分组来分组和提取差异和交集,并且我需要操作相对较快,因为我拥有大约一百万个 ID。
但我不知道如何在将 ID 视为集合中的一个元素时保持 ID 与文件名列表相关联。这可能与集有关,还是有任何集扩展可以启用此功能?
听起来您的数据类似于下面的示例数据。如果是这样,那么代码将显示如何使用散列 table 来执行您的要求。散列 table 可以是 Python dict
(在 id
上散列为键,文件名 list
作为关联值)或只是一个 set
个 id
元素,如果这是您真正想要的(尽管正如其他人在评论中建议的那样,dict
可能是最佳解决方案)。
files = [
{'filename':'foo101', 'id':1},
{'filename':'foo102', 'id':1},
{'filename':'foo103', 'id':1},
{'filename':'foo201', 'id':2},
{'filename':'foo202', 'id':2},
{'filename':'foo301', 'id':3},
{'filename':'foo401', 'id':4},
]
fileDict = defaultdict(list)
for d in files:
fileDict[d['id']].append(d['filename'])
[print(id, fileNames) for id, fileNames in fileDict.items()]
idSet = set(fileDict)
print(idSet)
示例输出:
1 ['foo101', 'foo102', 'foo103']
2 ['foo201', 'foo202']
3 ['foo301']
4 ['foo401']
{1, 2, 3, 4}
为方便起见,以上代码使用 defaultdict(list)
,但您也可以使用常规 dict
,如下所示:
files = [
{'filename':'foo101', 'id':1},
{'filename':'foo102', 'id':1},
{'filename':'foo103', 'id':1},
{'filename':'foo201', 'id':2},
{'filename':'foo202', 'id':2},
{'filename':'foo301', 'id':3},
{'filename':'foo401', 'id':4},
]
fileDict = {}
for d in files:
if d['id'] not in fileDict:
fileDict[d['id']] = []
fileDict[d['id']].append(d['filename'])
[print(id, fileNames) for id, fileNames in fileDict.items()]
idSet = set(fileDict)
print(idSet)