【问题标题】:How to create a dict equivalent in Python from Perl hash?如何从 Perl 哈希在 Python 中创建等效的 dict?
【发布时间】:2013-04-04 13:00:46
【问题描述】:

我是 python 新手,无法理解 dict 哈希。

这是我的 perl 代码:

my %sites;

foreach (@indexes) {
       push @{$sites{$1}}, $_ if (/.*\.(.*)/);
}

foreach my $sites (keys %sites)
{
        @devices = @{$sites{$sites}};
        #Do stuff

我如何在 Python 中做同样的事情?

【问题讨论】:

  • 你能描述一下你想要做什么吗,我的 perl 生锈了。
  • @monkut:类似于获取一组文件名并按扩展名对它们进行分组,然后一次处理一个扩展名
  • @ysth:完全正确。将相似的文件组合在一起,然后对相似的文件进行一些比较。

标签: python perl hash


【解决方案1】:

这是一个非常直接的翻译:

import re

re_domain = re.compile(".*\.(.*)")
sites = {}

for index in indexes:
    match = re_domain.search(index)
    if match:
        sites.setdefault(match.group(1), []).append(index)

for site_key in sites.keys():
    devices = sites[site_key]

更 Pythonic 的方式是这样做:

import collections
import os.path

sites = collections.defaultdict(list)

for index in indexes:
    root, ext = os.path.splitext(index)
    sites[ext].append(index)

for site_key, devices in sites.iteritems():
    ...

【讨论】:

  • 模式中的“/”不是 Perl 分隔符的残留吗?
  • 非常巧妙的技巧,这个dict.get()。我想总有一些东西可以发现......到目前为止,我总是痛苦地围绕dict 条目的默认值进行编码;-)
  • .get() 返回默认值——它不更新字典。您需要将 sites[match.group(1)] = 添加到该行的开头以获得所需的行为。另外,如果该行没有数学运算,那么match.group(1) 会给你一个AttributeError,所以你应该在该行之前放一个if match:
  • 也就是说,无论如何,“更 Pythonic”的解决方案要好得多。
  • 太棒了!非常感谢 - “更 Pythonic”的解决方案效果很好。
猜你喜欢
  • 2011-04-20
  • 2013-12-20
  • 1970-01-01
  • 2011-02-23
  • 2011-05-08
  • 1970-01-01
  • 2014-05-15
  • 2018-04-11
相关资源
最近更新 更多