【问题标题】:Why does on statement create a 6x6 array and other creates a 1x6 array python为什么on语句创建一个6x6数组而其他创建一个1x6数组python
【发布时间】:2021-01-06 21:16:26
【问题描述】:

另一个超级菜鸟问题 为什么

a = [["?" for i in range(6)] for i in range(6)]

用分隔的“?”创建一个 6x6 数组

print(a)

给予

[['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?']]

但是

a = [["?" * 6] *6]

用 "?" 创建 a1x6 数组在一起。

print(a)

给予

[['??????', '??????', '??????', '??????', '??????', '??????']]

如何在声明步骤中不使用 for 循环创建 6x6?

【问题讨论】:

  • 您可以使用[['?']*6]*6,但尝试创建嵌套列表是一种不好的方法,因为它实际上为您提供了 6 次相同的内部列表。你最好使用列表推导。

标签: python python-3.x multidimensional-array


【解决方案1】:

让我们看看你写了什么。

a = [["?" * 6] *6]

中间位 "?" * 6 是一串 6 个问号。当你在它周围加上方括号时,你会得到一个包含该字符串的列表,所以

['??????']

然后将该列表乘以 6,得到:

['??????', '??????', '??????', '??????', '??????', '??????']

然后你把整个东西放在另一个列表中

[['??????', '??????', '??????', '??????', '??????', '??????']]

或者,您可能打算这样做:

[['?'] * 6] * 6

这确实给了你一个你想要的列表

[['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?']]

然而,这实际上是一个内部列表['?', '?', '?', '?', '?', '?'] 在另一个列表中的六次。因此,如果您尝试修改内部元素,您会发现每个内部列表都被修改了。

你最好使用列表推导,或者中间立场,那就是:

a = [['?'] * 6 for _ in range(6)]

【讨论】:

    【解决方案2】:

    如果您必须在某处没有明确的for 的情况下这样做:

    import itertools
    
    >>> s = '?'*6
    >>> s
    '??????'
    >>> q = itertools.repeat(s,6)
    >>> list(map(list,q))
    [['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?'],
     ['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?'],
     ['?', '?', '?', '?', '?', '?'], ['?', '?', '?', '?', '?', '?']]
    >>>
    

    或者

    >>> s
    '??????'
    >>> z = zip(*itertools.tee(s,6))
    >>> list(z)
    [('?', '?', '?', '?', '?', '?'), ('?', '?', '?', '?', '?', '?'), ('?', '?', '?', '?', '?', '?'), ('?', '?', '?', '?', '?', '?'), ('?', '?', '?', '?', '?', '?'), ('?', '?', '?', '?', '?', '?')]
    >>>
    

    【讨论】:

      猜你喜欢
      • 2012-10-08
      • 1970-01-01
      • 2016-11-05
      • 2013-09-15
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多