【问题标题】:What does this list contain in Python, or is it a list?这个列表在 Python 中包含什么,或者它是一个列表?
【发布时间】:2017-11-28 18:58:57
【问题描述】:

我知道 Python 中的列表用方括号 [] 括起来。

我的输出如下所示:

[(451,165,76,-77,[98,42])]

这是一个元组列表吗?我们如何访问这些项目?

谢谢。

【问题讨论】:

  • 输出究竟来自哪里?您选择了numpy 标签,这就是为什么我很好奇它是否那么简单。
  • 为什么用numpyarrays标记?

标签: python arrays list numpy tuples


【解决方案1】:

只需在终端中试一试,一切不言自明:

>>> x = [(451,165,76,-77,[98,42])]
>>> type(x)
<type 'list'>
>>> x[0]
(451, 165, 76, -77, [98, 42])
>>> x[0][1]
165
>>> x[0][4]
[98, 42]
>>> type(x[0][4])
<type 'list'>
>>> x[0][4][1]
42

不管怎样,仅仅因为输出看起来像一个列表,它不需要是一个列表。它可以是更复杂的数据结构(某个用户定义类的对象),通过重载__str__()__repr__() 来指定如何打印(详见https://docs.python.org/3/reference/datamodel.html#object.str

【讨论】:

    【解决方案2】:

    这是一个list,其中包含一个tuple,其中前四个元素为integers,最后一个elementlistlistintegers

    您可以正确访问indexing 的所有值。以下是一些示例:

    >>> l = [(451,165,76,-77,[98,42])]
    >>> l[0]
    (451, 165, 76, -77, [98, 42])
    >>> l[0][0]
    451
    >>> l[0][1]
    165
    >>> l[0][3]
    -77
    >>> l[0][4]
    [98, 42]
    >>> l[0][4][0]
    98
    >>> l[0][4][1]
    42
    

    【讨论】:

      【解决方案3】:

      是的,这是一个元组列表。

      a = [(451,165,76,-77,[98,42])]
      type(a)     #> list
      type(a[0])  #> tuple
      

      您可以像这样访问元组的第一项:

      a[0][0]     #> 451
      

      元组的最后一项是一个列表:

      a[0][4]     #> [98, 42]
      

      要访问该列表的元素,您只需添加另一层括号:

      a[0][4][0]  #> 98
      

      【讨论】:

        【解决方案4】:

        这是一个包含一个元组的列表,它本身包含 5 个元素,其中一个是表格。

        访问:

        a=[(451,165,76,-77,[98,42])]
        
        a[0][0][2]   
        

        将返回 76

        a[0][0][4][0]   
        

        将返回 98

        【讨论】:

          【解决方案5】:

          是的,它是一个包含 一个 元素的列表。而且 - 正如你正确提到的 - 这个元素是一个元组。在这种情况下使用元组,因为它的最后一个元素也是一个列表(元组适合存储异构数据)。

          【讨论】:

            【解决方案6】:

            虽然直接的 Python 描述是一个包含整数和列表的元组的列表,但显示也与 numpy 结构化数组一致。

            定义复合数据类型:

            In [596]: dt = np.dtype('i,i,i,i,(2)i')
            In [597]: dt
            Out[597]: dtype([('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<i4', (2,))])
            

            使用此列表输入创建一个数组。复合 dtype(结构化数组)的数据采用元组列表的形式。每个元组代表一个记录或数组元素的数据:

            In [598]: arr = np.array([(451,165,76,-77,[98,42])], dtype=dt)
            In [599]: arr
            Out[599]: 
            array([(451, 165, 76, -77, [98, 42])],
                  dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<i4', (2,))])
            

            这个数组的打印看起来就像问题:

            In [600]: print(arr)
            [(451, 165, 76, -77, [98, 42])]
            

            这是一个包含 5 个字段的 1 元素数组。最后一个字段的形状为 (2,),实际上是一个 2 元素数组。

            In [601]: arr['f4']
            Out[601]: array([[98, 42]], dtype=int32)
            In [602]: _.shape
            Out[602]: (1, 2)
            

            【讨论】:

            • 在这种情况下,我会在回答中使用类型检查器:当数据作为字符串输出时,我们只能猜测数据的类型。但是,我怀疑您的猜测是正确的,因为操作标记为 numpy
            【解决方案7】:

            所以我不久前写了一个类型检查器,它对我很有帮助,因为当被问到作为字符串输出时,我们只能猜测数据的类型。据我们所知,它可能是PersonFrombulate 类型的对象,他们选择str()

            def type_diver(obj, prefix="", index = ""):
                print "%s'%s': %s%s" % (prefix, obj, type(obj), " - Accessible via " + index if index else "")
                if not isinstance(obj, str):
                    try:
                        for ind, elem in enumerate(obj):
                            type_diver(elem, " " * len(prefix) + "|---", index + "[%s]" % ind)
                    except TypeError:
                        pass  # Don't call recursively on non-iterable objects
            

            对于一个基本的 python 对象,根据您的输入:

            '[(451, 165, 76, -77, [98, 42])]': <type 'list'>
            |---'(451, 165, 76, -77, [98, 42])': <type 'tuple'> - Accessible via [0]
                |---'451': <type 'int'> - Accessible via [0][0]
                |---'165': <type 'int'> - Accessible via [0][1]
                |---'76': <type 'int'> - Accessible via [0][2]
                |---'-77': <type 'int'> - Accessible via [0][3]
                |---'[98, 42]': <type 'list'> - Accessible via [0][4]
                    |---'98': <type 'int'> - Accessible via [0][4][0]
                    |---'42': <type 'int'> - Accessible via [0][4][1]
            

            但我可以编写一个自定义类,str() 的输出看起来像这样。唯一知道的方法就是问。

            如果您的数据是 hpaulj suggested [一个 numpy 数组],您可能会看到如下内容:

            '[(451, 165, 76, -77, [98, 42])]': <type 'numpy.ndarray'>
            |---'(451, 165, 76, -77, [98, 42])': <type 'numpy.void'> - Accessible via [0]
                |---'451': <type 'numpy.int32'> - Accessible via [0][0]
                |---'165': <type 'numpy.int32'> - Accessible via [0][1]
                |---'76': <type 'numpy.int32'> - Accessible via [0][2]
                |---'-77': <type 'numpy.int32'> - Accessible via [0][3]
                |---'[98 42]': <type 'numpy.ndarray'> - Accessible via [0][4]
                    |---'98': <type 'numpy.int32'> - Accessible via [0][4][0]
                    |---'42': <type 'numpy.int32'> - Accessible via [0][4][1]
            

            鉴于每个人都会有一个他们感兴趣的不同对象,这是一个更通用的解决方案。但是,它确实只研究可迭代对象。

            【讨论】:

            • obj = [None]; obj[0] = obj; type_diver(obj) 失败:P
            • 根据需要添加尽可能多的错误处理。它很好地达到了它的目的。
            猜你喜欢
            • 2021-10-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-28
            • 2013-05-12
            • 2021-06-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多