【问题标题】:How to find non-string indices in array如何在数组中查找非字符串索引
【发布时间】:2021-04-16 03:47:26
【问题描述】:

有一个类似的数组

a = ['string', '1', '2', 'string2', '4', 'string5', '5' ...]

我怎样才能找到像这样的非字符串索引

[1,2,4,6 ...]

如果我使用它不起作用

isinstance(a, str)

【问题讨论】:

    标签: python python-3.x string integer indices


    【解决方案1】:

    如果你的listintegers 和字符串,你可以使用isnumericList Comprehension

    In [843]: a = ['string', '1', '2', 'string2', '4', 'string5', '5']
    
    In [847]: ans = [a.index(i) for i in a if i.isnumeric()]
    
    In [848]: ans
    Out[848]: [1, 2, 4, 6]
    

    或者,根据@MushifAliNawaz 的评论使用enumerate

    In [874]: ans = [c for c,i in enumerate(a) if i.isnumeric()]
    
    In [875]: ans
    Out[875]: [1, 2, 4, 6]
    

    【讨论】:

    • 可以用a.index(i)代替enumerate(),这样会更快更高效。
    • @MushifAliNawaz 谢谢。已更新我的答案。
    【解决方案2】:

    您应该使用loop 并检查数组中的每个元素:

    >>> a = ['string', '1', '2', 'string1', '3', 'string2', '3.0', '2.5']
    >>> results = []
    >>> for v in a:
    ...     try:
    ...             value = int(v)
    ...     except ValueError:
    ...             try:
    ...                     value = float(v)
    ...             except ValueError:
    ...                     continue
    ...     results.append(value)
    ...
    >>> results
    [1, 2, 3, 3.0, 2.5]
    

    【讨论】:

    • 不是反对者,但可能被反对,因为这种方法效率非常低,并且不会根据需要创建新列表。
    • OP 的列表包含数字作为字符串。尽管循环是这里的关键,但您必须改为检查它是否可以转换为数字(例如使用.isnumeric)而不是 int。
    • 重新使用.isnumeric,这种方式不覆盖case number是float类型的。
    【解决方案3】:
    [i for i, x in zip(range(len(a)), a) if not isinstance(x,str)]
    

    【讨论】:

    • 为什么会有不必要的复杂性?
    • 使用 enumerate() 会缩短一点。话又说回来,它仍然不起作用,因为列表中的所有元素都是字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多