【问题标题】:Simple list of tuples with wrong print打印错误的元组的简单列表
【发布时间】:2019-12-18 03:01:25
【问题描述】:

我正在使用 CPython 学习 Python。我正在阅读如何正确使用列表和元组,所以我设计了一个非常简单的程序来查看我是否知道我在做什么,但是正如我所看到的,理论上有问题而且我不知道什么是

我设计了 2 个函数:foo 和 foo2,打算打印相同的结果,但事实并非如此。

# Wrong output
def foo(v):
    print(v[:][0])

# Right output
def foo2(v):
    for i in range(0, 2):
        print(v[i][0])

v = [('ABC', 'DEF', 1), ('ABC2', 'DEF2', 2)]
foo(v)
foo2(v)

结果: foo 的输出:('ABC', 'DEF', 1) foo2 的输出:ABC ABC2

预期: foo 的输出:ABC ABC2 foo2 的输出:ABC ABC2

这里发生了什么?

【问题讨论】:

  • 标准列表不像 numpy 数组那样工作。 [:][0] 不会从列表中的所有数据中获取第一个元素。在 numpy 数组中,您可以使用 v[:,0] 来获取列表 ['ABC' 'ABC2'] - 但您仍然必须使用 " ".join()for-loop 才能正确显示它。
  • 在Python shell中,输入v[:]会得到什么?可能感兴趣:How to clone or copy a list?

标签: python


【解决方案1】:

foo 中,您传入一个元组列表,并使用v[:] 对其进行操作。 所有这一切基本上是复制你传入的列表。 明显:

>>> v
[('ABC', 'DEF', 1), ('ABC2', 'DEF2', 2)]
>>> v[:]
[('ABC', 'DEF', 1), ('ABC2', 'DEF2', 2)]

因此,当您访问v[:] 的第一个元素时,您得到的只是元组('ABC', 'DEF', 1)

【讨论】:

    【解决方案2】:

    v[:] 只是复制列表,它是一个从列表开始到结尾的列表切片

    如果你想让这个简短,你可以使用zip(*v), zip((1,2), (3,4)) 将 1 与 3 和 2 与 4 结合起来。* 星号运算符用于获取列表中的元素作为单独的函数参数

    【讨论】:

      【解决方案3】:

      嗯,[:] 没有做任何事情,所以你只是打印第一个 列表条目,

      这是元组 ('ABC', 'DEF', 1)

      在 foo2 中,您首先选择一个元组 ([ i ]),然后是元组的第一个条目 ([0])。

      【讨论】:

      • 好吧,[:] 做了一些事情......它正在创建一个新的列表的浅拷贝
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      相关资源
      最近更新 更多