【问题标题】:Pythonic way to test for elements in complex data structures测试复杂数据结构中元素的 Pythonic 方法
【发布时间】:2021-01-22 17:39:03
【问题描述】:

** 这是一个风格问题,而不是“编码问题”**

例如,在 Perl 中,测试复杂数据结构中元素或键的存在是很直观的。如果我像这样反序列化一大块 json:

[ { 'foo' : 'bar' } ]

我会这样做:

if ($array[0]{foo}) {
    print "foo exists\n";
}
if ($array[0]{bar}) {
    print "bar exists\n";
}

有了这个结果:

$ perl tmp.pl 
foo exists
$

如何在 Python 中轻松优雅地做到这一点?

【问题讨论】:

  • 我们在谈论什么确切的数据结构?
  • 你的意思是if any('foo' in obj for obj in [{'foo': 'bar'}])
  • 你应该在 perl 中使用exists $array->[0]{foo}...(这不是有效的 JSON,它使用双引号作为字符串)。
  • 它是什么数据结构无关紧要,我问的是原则。
  • @Shawn,视情况而定。大多数时候,您知道该值是 true 还是不存在,在这种情况下您不需要 exists

标签: python list perl dictionary


【解决方案1】:

Python 不会自动激活不存在的容器元素,但您可以简单地捕获在 LookupError 事件中引发的异常(KeyErrorIndexError 的基类:

try:
    array[0]["foo"]
    print("foo exists")
except LookupError:
    pass

try:
    array[0]["bar"]
    print("bar exists")
except LookupError:
    pass

【讨论】:

    【解决方案2】:

    您可以使用 in 关键字来使用 if 语句:

    if 'foo' in array[0]:
        print("foo exists")
    
    if 'bar' in array[0]:
        print("bar exists")
    

    仅供参考 array 是 python 内置的,所以我建议使用不同的变量名

    【讨论】:

    • 我喜欢这种方式。简单而离散。
    • 这不等同于 OP。 OP 正在执行真实性测试,而不是存在性检查。
    • OP 特别声明他们正在检查是否存在
    【解决方案3】:
    if ($a[0]{foo}) {                     # Perl
       ...
    }
    

    等价于

    if a[0].get("foo"):                   # Python
       ...
    

    如果你检查的是存在而不是真理怎么办?

    if (exists($a[0]{foo})) {             # Perl
       ...
    }
    

    等价于

    if "foo" in a[0]:                     # Python
       ...
    

    请注意,如果数组为空,上述 Perl 和 Python sn-ps 的行为会有所不同,但如果数组为空,则不应使用它们中的任何一个。

    如果你想允许空数组,你应该一直在使用

    no autovivification;                  # Perl
    if ($a[0]{foo}) {
       ...
    }
    

    if (@a && $a[0]{foo}) {                # Perl
       ...
    }
    

    Python 等价物将是以下之一:

    if len(a) and a[0].get("foo"):         # Python
       ...
    
    if a and len(a) and a[0].get("foo"):   # Python
       ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      相关资源
      最近更新 更多