Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多级数据中使用Python组合_Python_Dictionary_Combinations - Fatal编程技术网

在多级数据中使用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
中,路径中不同目录的数量总是两个?如果您知道如何操作,这很容易!非常感谢,效果很好。