在多级数据中使用Python组合
我有一本字典,在多级数据中使用Python组合,python,dictionary,combinations,Python,Dictionary,Combinations,我有一本字典,imageHashes,带有键=路径,和值=整数,例如 imageHashes['/directorya/jim.txt'] = 7 imageHashes['/directorya/nigel.txt'] = 68 imageHashes['/directoryb/ralph.txt'] = 17 imageHashes['/directoryb/baba.txt'] = 43 使用组合,我可以通过以下方式循环: for keypair in list(combinations
imageHashes
,带有键=路径
,和值=整数
,例如
imageHashes['/directorya/jim.txt'] = 7
imageHashes['/directorya/nigel.txt'] = 68
imageHashes['/directoryb/ralph.txt'] = 17
imageHashes['/directoryb/baba.txt'] = 43
使用组合,我可以通过以下方式循环:
for keypair in list(combinations(imageHashes,2)):
do something
问题是我只想在不同目录中的对之间做一些事情,所以在
和jim
ralph
和nigel
ralph
和jim
baba
和nigel
baba
不是
和jim
nigel
和ralph
baba
我有点笨,有谁能告诉我最好的开始方式吗
continue
对组合进行迭代,并跳过您不想处理的组合。您需要知道的另一件事是如何检查两个文件是否在同一个目录中——换句话说,它们的目录名是否匹配?这就是os.path.dirname
给我们的
from itertools import combinations
from os.path import dirname
imageHashes = {}
imageHashes['/directorya/jim.txt'] = 7
imageHashes['/directorya/nigel.txt'] = 68
imageHashes['/directoryb/ralph.txt'] = 17
imageHashes['/directoryb/baba.txt'] = 43
for path_a, path_b in combinations(imageHashes, 2):
if dirname(path_a) == dirname(path_b):
continue
print("They're different!: {} vs. {}".format(path_a, path_b))
其中:
它们是不同的!:/directoryb/baba.txt vs./directoryb/jim.txt
他们不一样/directoryb/baba.txt vs./directoryb/nigel.txt
他们不一样/directorya/jim.txt vs./directoryb/ralph.txt
他们不一样/directorya/nigel.txt vs./directoryb/ralph.txt
请注意,无需将
组合返回的迭代器转换为列表:这只会浪费时间。如果您需要一种通用方法,即拥有任意数量的目录:
from itertools import product
# get the set of different directories
dirs = {path.rsplit('/', 1)[0] for path in imageHashes}
# get iterators for every directory
dirs_iter = [[path for path in imageHashes if path.startswith(dir)] for dir in dirs]
# and now every possible combination between them
for comb in product(*dirs_iter):
do something
现在comb
将在可用路径中具有与不同目录一样多的元素;也就是说,每个comb
每个目录都有一个路径。在imageHashes
中,路径中不同目录的数量总是两个?如果您知道如何操作,这很容易!非常感谢,效果很好。