Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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
使用trie在python中创建目录结构_Python_Directory Structure_Trie - Fatal编程技术网

使用trie在python中创建目录结构

使用trie在python中创建目录结构,python,directory-structure,trie,Python,Directory Structure,Trie,我有一个文件名列表: filename=[“111”、“112”、“1341”、“2213”、“2131”、“22222”、“11111”] 这应该组织在一个目录结构中,并且一个目录中的最大文件数不应该大于2。因此,如果子树中的文件量不超过最大值,我将创建一个前缀树(trie,下面的代码)存储在字典中,前缀作为键和'end': trie=make\u trie(文件名,max\u freq=2) 对于每个文件名,我在trie中进行查找(下面的代码),并相应地构建路径: for f in file

我有一个文件名列表:

filename=[“111”、“112”、“1341”、“2213”、“2131”、“22222”、“11111”]

这应该组织在一个目录结构中,并且一个目录中的最大文件数不应该大于
2
。因此,如果子树中的文件量不超过最大值,我将创建一个前缀树(trie,下面的代码)存储在字典中,前缀作为键和
'end'

trie=make\u trie(文件名,max\u freq=2)

对于每个文件名,我在trie中进行查找(下面的代码),并相应地构建路径:

for f in filenames:
    print("Filename: ", f, "\tPath:", get_path(f, trie))

Filename:  111  Path: 1/1/1/
Filename:  112  Path: 1/1/2/
Filename:  1341         Path: 1/3/
Filename:  2213         Path: 2/2/
Filename:  2131         Path: 2/1/
Filename:  22222        Path: 2/2/
Filename:  11111        Path: 1/1/1/
这很管用,但对于我的trie(
make_-trie
)和lookup(
get_-path
)的幼稚实现,这就变得令人望而却步了。我的猜测是,我应该采用一个有效的现有trie实现,例如
pytrie
datrie
,但我真的不知道如何制作一个后缀数阈值为2的trie,因此我有点陷入了如何使用包的困境,例如:

import datrie
tr = datrie.Trie(string.digits) # make trie with digits
for f in filenames:
    tr[f] = "some value" # insert into trie, but what should be the values??

tr.prefixes('111211321') # I can look up prefixes now, but then what?
如何使用现有的快速trie实现来创建目录结构

我天真地表达了trie和loookup:

def make_trie(words, max_freq):
    root = dict()
    for word in words:
        current_dict = root
        for i in range(len(word)):
            letter = word[i]
            current_prefix = word[:i+1]
            prefix_freq = sum(list(map(lambda x: x[:i+1]==current_prefix, words)))
            if prefix_freq > max_freq:
                current_dict = current_dict.setdefault(letter, {})
            else:
                current_dict = current_dict.setdefault(letter, "end")
                break
    return root

def get_path(image_id, trie):
    result = ""
    current_dict = trie
    for i in range(len(image_id)):
        letter = image_id[i]
        if letter in current_dict:
            result += letter + "/"
            if current_dict[letter] == "end":
                break
            current_dict = current_dict[letter]
    return result

这可以通过使用
os.makedirs
实现

导入操作系统
def create_dir_结构(文件名):
对于文件名中的文件名:
makedirs操作系统(
“/”.join(str中的e代表e(文件名))
)
创建目录结构(
['1111', '1123']
)

如果您希望看到任何不同的行为,请在评论中告诉我,这可以使用
os.makedirs

导入操作系统
def create_dir_结构(文件名):
对于文件名中的文件名:
makedirs操作系统(
“/”.join(str中的e代表e(文件名))
)
创建目录结构(
['1111', '1123']
)

在评论中告诉我,如果您希望看到任何不同的行为

您真的需要trie,还是您的目标只是创建目录结构?我真的不需要trie您真的需要trie,或者你的目标仅仅是创建一个目录结构?我真的不需要一个目录。这没有考虑到最大目录数的限制。如果每个目录只允许一个文件(以及更多目录),这将起作用。但是,你如何添加
['1','2','3','4','5']
如果每个目录的子目录限制为
2
,并且每个目录的文件限制为
2
?需要更多的假设(关于字母表大小w.r.t最大常数)才能使问题可行。这没有考虑到最大目录数的限制。如果每个目录只允许一个文件(以及更多目录),这将起作用。但是,您如何添加
['1','2','3','4','5']
如果每个目录的子目录限制为
2
,并且每个目录的文件限制为
2
?需要更多的假设(字母表大小w.r.t最大常数)才能使问题可行。
def make_trie(words, max_freq):
    root = dict()
    for word in words:
        current_dict = root
        for i in range(len(word)):
            letter = word[i]
            current_prefix = word[:i+1]
            prefix_freq = sum(list(map(lambda x: x[:i+1]==current_prefix, words)))
            if prefix_freq > max_freq:
                current_dict = current_dict.setdefault(letter, {})
            else:
                current_dict = current_dict.setdefault(letter, "end")
                break
    return root

def get_path(image_id, trie):
    result = ""
    current_dict = trie
    for i in range(len(image_id)):
        letter = image_id[i]
        if letter in current_dict:
            result += letter + "/"
            if current_dict[letter] == "end":
                break
            current_dict = current_dict[letter]
    return result