问题标签 [autovivification]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 使用 Python 解析和重组 CSV 文件
蟒蛇大师,
过去,我一直使用 Perl 来处理非常大的文本文件以进行数据挖掘。最近我决定切换,因为我相信 Python 让我更容易浏览我的代码并弄清楚发生了什么。与 Perl 相比,Python 的不幸(或者可能是幸运?)的事情是存储和组织数据极其困难,因为我无法通过自动激活创建散列的散列。我也无法总结字典词典的元素。
也许我的问题有一个优雅的解决方案。
我有数百个包含数百行数据的文件(所有文件都可以放入内存)。目标是结合这两个文件,但有一定的标准:
对于每个级别(仅在下面显示一个级别),我需要为在所有文件中找到的每个缺陷类创建一行。并非所有文件都具有相同的缺陷。
对于每个级别和缺陷类别,总结在所有文件中找到的所有 GEC 和 BEC 值。
最终输出应如下所示(更新的示例输出,错字):
级别缺陷Class BECtotals GECtotals
1415PA, 0, 643, 1991
1415PA, 1, 1994, 6470
...等等.....
档案一:
文件二:
我最大的问题是能够对字典进行总结。这是我到目前为止的代码(不工作):
谢谢你看这个!!!!!
亚历克斯
python - 在 Python 中具有默认值的类似 PERL 的自动生存,并从不存在的任意嵌套返回默认值?
假设我想在 Python 中使用类似 PERL 的自动生存,即:
有几种主要的方法可以做到这一点:
好的——简单。
现在假设我想从缺少键的字典中返回默认值。再一次,有几种方法可以做到这一点:
- 对于非嵌套路径,您可以使用
__missing__
钩子 - try/except 阻止包装对可能丢失的密钥路径的访问
- 使用
{}.get(key, default)
(不容易使用嵌套字典)即,没有版本autoviv.get(['nested']['key']['no key of this value'], default)
这两个目标似乎存在不可调和的冲突(基于我在过去几个小时试图解决这个问题。)
这是问题:
假设我想要一个 Autovivifying dict 1) 创建嵌套结构d['arbitrary']['nested']['path']
;AND 2) 从不存在的任意嵌套返回默认值,而不将其包装在 try/except 中?
以下是问题:
- 的调用
d['nested']['key']['no key of this value']
等效于(d['nested'])['key']['no key of this value']
。__getitem__
如果不返回 ALSO 覆盖的对象,则覆盖不起作用__getitem__
。 - 如果您测试该路径是否存在,那么这两种创建 Autovivifier 的方法都会创建一个 dict 条目。即,
if d['p1']['sp2']['etc.']
如果您只是使用if
.
如何在 Python 中提供一个 dict,它将:
- 创建类型的访问路径
d['p1']['p2'][etc]=val
(Autovivication); - 如果您测试是否存在,请不要创建相同的路径;
- 返回一个默认值(如
{}.get(key, default)
)而不包含在 try/except 中 - 我不需要完整的 dict 操作集。真的只有
d=['nested']['key']['value']=val
和d['nested']['key']['no key of this value']
等于一个默认值。我希望测试d['nested']['key']['no key of this value']
不会创建它,但会接受。
?
perl - 仅当 Perl 中存在哈希条目时才有效获取哈希条目
我经常写这样的代码片段:
我想要做的是从哈希中获取值,如果哈希中有那个键,同时我想避免自动激活哈希条目,如果它不存在的话。
然而,这让我感到非常低效:我正在做一个哈希查找以找出一个键是否存在,然后如果它确实存在,我正在对同一个键进行另一个哈希查找以提取它。
它在多级结构中变得更加低效:
在这里,我大概做了 9 次哈希查找而不是 3 次!
perl 是否足够聪明来优化这种情况?或者是否有其他一些习惯用法可以在不自动激活条目或进行两次连续查找的情况下获取哈希值?
我知道自动生存模块,但如果可能的话,我正在寻找不需要安装 XS 模块的解决方案。此外,我还没有机会尝试这个模块,我不完全确定在多级哈希的情况下会发生什么 - pod 说:
如果密钥不存在,将返回 undef - 这是否意味着:
如果 $key1 不存在,我会因为我试图取消引用 undef 而死吗?如果是这样,为了避免这种情况,您可能仍然需要进行多级测试以确保存在。
python - 使用 defaultdict 的 Python 单行树。如何减少所需的参数数量?
我正在使用这个gist 的defaultdict 单行树。
[]
目前,您必须为要添加的每个节点单独提供一个。
IE:
我的问题是,我如何能够展平输入,以便我可以提供一个列表来实现相同的结果?
IE:
谢谢你的帮助!
python - Python中的递归定义
我只是遇到了以下在 Python中实现AutoVivification的方式:
以下构造如何工作?
Tree
似乎没有在 lambda 函数的主体之前定义,也没有作为参数传递。
lambda 函数的主体在Tree
定义之前是如何知道的?该语言还支持哪些其他类型的递归定义?
java - 地图的通用自动激活功能
如何使用泛型创建激活键?此代码甚至无法编译:
list - 使用任意长的值列表更新 python 字典
我有一个工作问题,我需要能够从任意长的键列表中更新字典中的值。键列表和字典都是在运行时从相同的数据生成的,但我不知道之前的数据中有多少键。从数据中获取的键列表是用户在运行时指定的。
好的,所以这解决了必须能够从列表信息中更新字典中的值,该列表信息包括: 1. 键列表,按与字典中嵌套键相同的顺序排序 2. 要更新的值该键列表信息。
apache - autovivication.pm 中的 Perl cgi 编译错误
我正在使用一个使用我们自己的库的 perl cgi 脚本,它使用“no autovivification”编译指示。例如
/usr/lib/company/mysim.cgi:
/usr/lib/perl5/Company/Module1.pm
大约 50% 的情况下,当访问 URL 以到达 cgi 脚本时,编译会失败并...
(取自 /var/log/apache2/ssl/error.log,因为此脚本位于 https 端口上)。
我的环境是: - debian jessie (8.2) - tomcat7 - apache2 (2.4) - perl 5.20.2 - libautovivification-perl 0.12-1+b1
我的问题是:
有没有人见过这个?由于“使用严格”编译指示,自动生存模块无法编译似乎很奇怪。
谁能解释编译错误的间歇性?更奇怪的是,cgi 有一半的时间无法编译,而另一半则工作正常(即运行并返回预期结果)。
谢谢你的时间。
2015 年 9 月 12 日:一些附加信息...
感谢大家的反馈。
没有显式创建线程,尽管这是在 apache 的上下文中,因此可能存在请求的线程化。
根本原因似乎是 XSLoader 中的故障。至少这个最小的工作示例......
编译,而这
失败并出现相同的错误。
所以,我会在 apache 日志中四处寻找加载错误......某处。
感谢你的宝贵时间。
2015 年 12 月 16 日:更新 - 已修复
根本原因是 mod_perl,再加上 apache 2.2 和 2.4 之间的(可能的)变化。脚本的 apache 配置,给它一个 /cgi-bin/script 的 ScriptAlias URI,发生在设置 URI /cgi-bin 以由 mod_perl 处理之前。在 apache 2.2 中,这种排序似乎很重要,并且脚本不是由 mod_perl 处理的。然而,在 apache 2.4 中,排序似乎并不重要,脚本现在由 mod_perl 处理。
出现错误是因为这个脚本不是(也从未打算)由 mod_perl 处理。解决方法是将脚本的 URI 更改为 /somethingelse/script。
感谢大家的评论。
arrays - Perl:自动生存不会在哈希中创建数组
我有一段 perl 脚本:
我试图将命令推送到一个数组中,我决定将其保存在一个哈希中,因为我认为我可以让我的生活变得轻松而不是这样做if(!defined($QUEUES[$current_queue]))$QUEUES[$current_queue]=[];
我使用Data::Dumper
了一个常规的 for 循环,发现没有为 $QUEUE 中的任何键定义任何内容,从 0 到 $thread_count-1。这不是教科书自动复活的用法吗?我究竟做错了什么?