- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从专有数据库中获取目录和项目列表。列表也可以是巨大的,包含数千个 View 和各种嵌套。列表示例:
"MIPK",
"MIPK\/CM.toroidal",
"MIPK\/CM.Supervoid",
"MIPK\/DORAS",
"MIPK\/DORAS\/CRUDE",
"MIPK\/DORAS\/CRUDE\/CM.forest",
"MIPK\/DORAS\/CRUDE\/CM.benign",
"MIPK\/DORAS\/CRUDE\/CM.dunes",
"MIPK\/DORAS\/COMMODITIES",
"MIPK\/DORAS\/COMMODITIES\/CRUDE",
"MIPK\/DORAS\/COMMODITIES\/CRUDE\/CM.tangeant",
"MIPK\/DORAS\/COMMODITIES\/CRUDE\/CM.astral",
"MIPK\/DORAS\/COMMODITIES\/CRUDE\/CM.forking"
目录以大写形式用\/
分隔,大小写混合代表项目。
我现在返回的JSon是这样的:
{
"contents": [{
"root_path": "MIPK",
"root_name": "MIPK",
"directories": [{
"subd_name": "DORAS",
"subd_path": "MIPK.DORAS"
}],
"views": [{
"view_name": "CM.toroidal"
},
{
"view_name": "CM.Supervoid"
}
]
}, {
"root_path": "MIPK.DORAS",
"root_name": "DORAS",
"directories": [{
"subd_name": "CRUDE",
"subd_path": "MIPK.DORAS.CRUDE"
},
{
"subd_name": "COMMODITIES",
"subd_path": "MIPK.DORAS.COMMODITIES"
}
],
"views": []
}, {
"root_path": "MIPK.DORAS.CRUDE",
"root_name": "CRUDE",
"directories": [],
"views": [{
"view_name": "CM.forest"
},
{
"view_name": "CM.benign"
},
{
"view_name": "CM.dunes"
}
]
}, {
"root_path": "MIPK.DORAS.COMMODITIES",
"root_name": "COMMODITIES",
"directories": [{
"subd_name": "CRUDE",
"subd_path": "MIPK.DORAS.COMMODITIES.CRUDE"
}],
"views": []
}, {
"root_path": "MIPK.DORAS.COMMODITIES.CRUDE",
"root_name": "CRUDE",
"directories": [],
"views": [{
"view_name": "CM.tangeant"
},
{
"view_name": "CM.astral"
},
{
"view_name": "CM.forking"
}
]
}]
}
当前代码:
import logging
import copy
import time
def fetch_resources(input_resources_list):
'''
:return: Json list of dictionaries each dictionary element containing:
Directory name, directory path, list of sub-directories, list of views
resource_list is a flattened list produced by a database walk function
'''
start = time.time()
resources = {
'contents': [{}]
}
for item in input_resources_list:
# Parsing list into usable pieces
components = item.rsplit('\\', 1)
if len(components) == 1:
# Handles first element
root_dict = {'root_path': components[0],
'root_name': components[-1],
'directories': [],
'views': []
}
resources['contents'][0].update(root_dict)
else:
# Enumerate resources in list so search by key value can be done and then records can be appended.
for ind, content in enumerate(copy.deepcopy(resources['contents'])):
if resources['contents'][ind]['root_path'] == components[0]:
# Directories are upper case, adds a new entry if
if clean_item.isupper() :
root_dict = {'root_path': components[0],
'root_name': components[-1],
'directories': [],
'views': []
}
resources['contents'].append(root_dict)
sub_dict = {'subd_path': components[0],
'subd_name': components[-1]}
resources['contents'][ind]['directories'].append(sub_dict)
elif clean_item.isupper() == False :
resources['contents'][ind]['views'] \
.append({'view_name':components[-1]})
print 'It took {}'.format((time.time() - start)*1000)
return resources
这适用于小型工作负载(大约 100-500),但不适用于 000 的目标工作负载。
如何针对时间优化方法?
目前,枚举循环是为输入列表中的每个项目重建的,以便通过 root_path
键值进行搜索。有没有更简单的方法来搜索字典列表中的键值并将条目附加到该条目目录和 View 列表?
最佳答案
您在构建这些字符串时丢弃了很多信息。例如,当您看到 MIPK\/DORAS
时,无法知道它是一个文件(它应该只是父目录列表中的一个字符串)、一个叶目录(它应该是一个列表在父目录的字典中)或中间目录(应该是父目录字典中的字典)。你能做的最好的事情(没有二次嵌套搜索)就是猜测,如果你猜错了,稍后再改。
另外,有时你的中间目录甚至不会自己出现,而只是作为后面路径的组成部分出现,但有时它们会出现。因此,有时您必须修复的“猜测”将是根本不存在的目录。
最后,如果您想要的格式不明确,例如,any directly 可以同时包含文件和目录(它应该是一个字典还是一个列表),或者根本什么都没有(它应该是一个空字典,一个空列表,或者只是一个字符串?)。
然而,事情似乎是有序的,模棱两可的情况似乎并没有真正出现。如果我们可以依赖这两者,我们可以通过查看它是前缀还是下一个条目来判断某物是否是目录。然后我们可以只读取叶子并将它们放入 0 个或多个嵌套字典中的列表中的字符串集合。
因此,首先,我们要迭代相邻的路径对,以便更容易地做到“它是下一个值的前缀吗?”检查:
output = {}
it1, it2 = itertools.tee(paths)
next(it2)
pairs = itertools.zip_longest(it1, it2, fillvalue='')
for path, nextpath in pairs:
if nextpath.startswith(path):
continue
现在,我们知道 path
是一片叶子,所以我们需要找到要将其附加到的列表,如果需要则创建一个,这可能意味着沿途递归创建字典:
components = path.split(r'\/')
d = output
for component in components[:-2]:
d = d.setdefault(component, {})
d.setdefault(components[-2], []).append(components[-1])
我还没有测试过这个,但是它应该对明确的输入做正确的事情,但是如果任何目录同时包含文件和子目录,或者任何顶级目录包含文件,或者任何其他不明确的情况(空目录除外,它们将被视为与文件相同)。
当然,这有点丑陋,但这是解析一种丑陋格式所固有的,该格式依赖于许多特殊情况规则来处理本来会模棱两可的内容。
关于python - 有效地将扁平字符串解析为嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51751934/
我只想国家和资本化的值(value)。 这是我的完整代码: cities = { 'rotterdam': { 'country': 'netherlands',
想更好地了解如何比较对象类型的键。 dicOverall.exists(dic2) 返回 False,而 dicOverall.exists(dic1) 返回 True。我不太确定 .Exists 如
我是编程和 python 的新手,我不知道如何解决这个问题。 my_dict = {'tiger': ['claws', 'sharp teeth', 'four legs', 'stripes'
这个问题已经有答案了: Accessing an object property with a dynamically-computed name (19 个回答) 已关闭 8 年前。 我引用了这篇文
希望有人能帮忙。我正在使用 Python,我希望能够执行以下操作。 我有一组对象(例如形状)和一系列作用于这些对象的命令。命令的格式为命令字符串,后跟可变数量的参数,可以是字符串或整数 例如形状“矩形
我在文件中保存了一本字典。我从 python 交互式 shell 将字典加载到内存中,我的系统监视器显示 python 进程消耗了 4GB。以下命令提供以下输出: size1 = sys.getsiz
如果我运行以下代码: import json foo = [ { "name": "Bob", "occupation": "", "stand
我尝试获取列名及其索引,并将结果保存为数据框或字典: df <- data.frame(a=rnorm(10), b=rnorm(10), c=rnorm(10)) 我该怎么做?谢谢。 column
我正在尝试获取输入,如果字典 logins 有一个与我的输入匹配的键,我想返回该键的值。 logins = { 'admin':'admin', 'turtle':'password1
在 Perl 世界中有一个很棒的东西叫做 CPAN .它是开源 Perl 库的大型存储。 我使用来自 CPAN 的模块,我已经发布了 several distributions myself . 我使
这个问题已经有答案了: Is there a Python dict without values? (3 个回答) 已关闭 3 年前。 我有一个问题,我想跟踪大量值。如果我从未遇到过该值,我将执行操
想知道这是否可能。 我们有一个第 3 方库,其中包含有关用户的识别信息... 与库的主要交互是通过一个以字符串为键的 HashTable,并返回该键的信息对象图。 问题是, key 显然是区分大小写的
我是 .NET 编程的新手。对不起,如果这个问题以前被问过。 我目前正在学习 F#。 Dictionary、Hashtable 和 Map 之间有什么区别?我应该什么时候使用? 我还有一个标题中没有提
我正在尝试使用SVM进行3类分类。为此,我正在SVM培训期间准备词汇表。但是,由于我在SVM预测期间获得随机结果,因此我怀疑我的词汇创建方法中存在一些问题。我创建词汇的代码如下: //Mat trai
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
假设我有一个以下形式的嵌套字典: {'geo': {'bgcolor': 'white','lakecolor': 'white','caxis': {'gridcolor': 'white', 'l
我有一个 java 应用程序,每秒启动和停止数亿个项目(从外部脚本调用)多次。 Input: String key Output: int value 此应用程序的目的是在从未永远改变的Map(约30
我正在尝试找出字典与集合和数组相比的相对优势和功能。 我发现了一篇很棒的文章here但找不到一个简单的表格来比较所有不同的功能。 有人知道吗? 最佳答案 请参阅下表,对集合和字典进行有用的比较。 (该
我想要一个字典,它可以为字典中没有的任何键返回一个指定的值,例如: var dict = new DictWithDefValues("not specified"); dict.Add("bob78
我是 python 新手,目前仍在学习如何处理列表和字典。 我有这两个功能 def food_database(item_name, size_serv, calorie_serv, prot
我是一名优秀的程序员,十分优秀!