【问题标题】:python checking list-like but not string, bytes, dicts, etcpython 检查类似列表但不检查字符串、字节、字典等
【发布时间】:2020-05-10 22:59:22
【问题描述】:

在 python 中,字符串可以循环/迭代,如列表、元组等。我们对 dict 和 bytes 有相同的要求。因此,使用 isinstance 与任何 collections.abc 类都会在列表、字节、字典等上给出 True。

我正在寻找一种优雅的方式来检查我是否收到了一个方法的类似列表的参数:列表、元组、集合、numpy 数组、熊猫系列等?

你有什么建议不是 test if iterable 但既不是 string 也不是 dict 等。

我真的在尝试匹配非开发人员对列表是什么的直观理解。

谢谢。

【问题讨论】:

  • 你认为什么是“类列表”?您想具体包括哪些特征,以及您想排除哪些特征?为什么要排除字符串但包含元组?
  • 检查是否为实例and not type(your_var) not in [str, bytes]
  • @Boris 这就是我实际要做的,也是我想要避免的(不是“优雅”)
  • @Carcigenicate List like 是对列表的直观理解:一些可以用项目符号列出的元素,就像任何非开发人员都会理解的那样。如果我问我妈妈“toto”是否是一个列表,她会说不......
  • 考虑到这是一个相当随意的分离,我认为手动硬编码类型与您将获得的一样好。如果有使用的方法模式等,你可以找到一个特定的基类来检查。不过这里不是这样。

标签: python python-3.x string types iterable


【解决方案1】:

假设您使用的是numpy,您可以构造一个数组并检查其尺寸。 ndim 为零的任何内容几乎都符合您的定义。

>>> import numpy as np
>>> f = np.asarray("hello") # string
>>> f.ndim
0
>>> f=np.asarray({1:2,3:4}) # dict
>>> f.ndim
0
>>> f=np.asarray([1,2,3,4]) # list
>>> f.ndim
1
>>> f=np.asarray((1,2,3,4)) # tuple
>>> f.ndim
1

不幸的是,这似乎不适用于set

>>> f=np.asarray({1,2,3,4}) # set
>>> f.ndim
0

【讨论】:

    【解决方案2】:

    另一种选择是检查您的变量是否是可迭代的,但手动排除您认为不应接受的内容:

    from collections.abc import Iterable
    
    excluded_types = (str, dict)
    if isinstance(obj, Iterable) and not isinstance(obj, excluded_types):
      do_something()
    

    但是你应该定义你期望什么可迭代的行为来考虑“类似列表”的东西。

    【讨论】:

    • 谢谢,但这是我想要避免的。见我的其他 cmets。结论似乎是不可能的。
    【解决方案3】:

    您可以为此创建自己的函数:

    import numpy as np
    import pandas as pd
    
    def is_list_like(obj):
        valid_types = (list, tuple, set, np.ndarray, pd.Series)
        return isinstance(obj, valid_types)
    

    这适用于您喜欢使用的任何“类似列表”的任意定义 - 只需从 valid_types 元组中添加/删除类型。

    【讨论】:

    • 好吧,为什么不呢。这或多或少是我现在所做的。我已经在问题的 cmets 上发表了评论。我真的认为这在 python 中是不可能的,但我只是想确定......无论如何谢谢。
    • 我明白你的意思,但我认为除了硬编码你想要类似列表的类型之外,没有更好的“内置”方式。您说集合类似于列表,但从实现的角度来看,它们更类似于字典。 mylist[0]mydict[0] 都调用 obj.__getitem__(0) 这一事实意味着,即使在实现层面上,类似列表与非列表之间也没有简单、明确的区别。
    • 真@jfaccioni。事实上,实施是另一个故事,我被卡住了。我将继续使用“不雅”的方式:-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    相关资源
    最近更新 更多