如何将垂直数组迁移到水平?

时间:2017-09-03 21:08:05

标签: python arrays

我正在使用Python 2;如何将数组迁移到多个维度?例如:

foo['a']['b']['c']...

要:

a = ['a', 'b', 'c']
b = ['a', 'x', 'y']

并检查是否存在,示例有多个数组:

foo['a'] -> ['b'], ['x']
foo['a']['b'] -> ['c']
foo['a']['x'] -> ['y']

结果:

http://foo.site/a ->
    /b
    /c
    /d

http://foo.site/a/b ->
    /file1.jpg
    /file2.jpg

我需要这个用于制作文件目录树导航,因为发现的每个路径都需要添加路径和文件,路径是从db获取的。需要单独导航示例:

const TicketsApp = StackNavigator({
  Movies: { screen: MoviesList },
  Confirmation: { screen: Confirmation },
});

对于每个路径进行拆分/并且需要制作多维数组或字典,每个路径和文件都可用。

2 个答案:

答案 0 :(得分:0)

你的要求并不是很清楚,

尽管如此,您可以像这样定义一个简单的树结构:

import collections

def tree():
    return collections.defaultdict(tree)

并按如下方式使用:

foo = tree()
foo['a']['b']['c'] = "x"
foo['a']['b']['d'] = "y"

你得到:

defaultdict(<function tree at 0x7f9e4829f488>,
            {'a': defaultdict(<function tree at 0x7f9e4829f488>,
                              {'b': defaultdict(<function tree at 0x7f9e4829f488>,
                                                {'c': 'x',
                                                 'd': 'y'})})})

类似于:

{'a': {'b': {'c': 'x', 'd': 'y'})})})

修改

但是你也要求“对于每个路径进行拆分/并且需要制作多维数组或字典,每个路径和文件都可用。”

我通常使用os.walk来搜索目录中的文件:

import os
import os.path


start_dir = ".."

result = {}
for root, filenames, dirnames in os.walk(start_dir):
    relpath = os.path.relpath(root, start_dir)
    result[relpath] = filenames

答案 1 :(得分:0)

此解决方案适用于我使用eval和Dictionaries of dictionaries merge

def __init__(self):
    self.obj = {}

def setPathToObject(self, path):
    path_parts = path.replace('://', ':\\\\').split('/')
    obj_parts  = eval('{ \'' + ('\' : { \''.join(path_parts)) + '\' ' + ('}' * len(path_parts)))
    obj_fixed  = str(obj_parts).replace('set([\'', '[\'').replace('])}', ']}').replace(':\\\\', '://')
    obj        = eval(obj_fixed)
    self.obj = self.recMerge(self.obj.copy(), obj.copy())
    return obj

def recMerge(self, d1, d2):
    for k, v in d1.items():
        if k in d2:
            if all(isinstance(e, MutableMapping) for e in (v, d2[k])):
                d2[k] = self.recMerge(v, d2[k])
            elif all(isinstance(item, list) for item in (value, dict2[key])):
                d2[key] = v + d2[k]
    d3 = d1.copy()
    d3.update(d2)
    return d3

测试:

setPathToObject('http://www.google.com/abc/def/ghi/file1.jpg')
setPathToObject('http://www.google.com/abc/xyz/file2.jpg')
setPathToObject('http://www.google.com/abc/def/123/file3.jpg')
setPathToObject('http://www.google.com/abc/def/123/file4.jpg')
print self.obj

> { 'http://www.google.com': { 'abc': { 'def': { 'ghi': [ 'file1.jpg' ], '123': [ 'file3.jpg', 'file4.jpg' ] }, 'xyz': [ 'file2.jpg' ] } } }

适用于Python 2.