将字符串分成两个二维数组python

时间:2019-11-13 20:53:09

标签: python python-3.x

我想做的是将一个字符串(密码)分成多个组,并不复制(假设每7个字符分成一组),我要做的就是是每7个字母取一个,并将它们添加到二维数组中的一行中,接下来的7个以此类推。依此类推。

我试图用两个三维数组来做到这一点,但我遇到了一个问题,它总是在每次更新时更改我所有的数组,而我不想复制它。

让我给你举个例子:

def splitter(cipher,key_length):

    rows = math.ceil(len(cipher)/key_length)
    columns = key_length
    arr = [[""]*columns]*rows
    arr1=[]
    for row in range(rows):
        for column in range(columns):
            if (row * columns + column)< len(cipher):
                arr[row][column] = cipher[row * columns + column]
            else:
                arr[row][column] = ""
        arr1.append(arr[row])
    print(arr1)


splitter("QPWKALVRXCQZIKGRBPFAEOMFLJMSDZVDHXCXJYEBIMTRQWNMEAIZRVKCVKVLXNEICFZPZCZZHKMLVZVZIZRRQWDKECHOSNYXXLSPMYKVQXJTDCIOMEEXDQVSRXLRLKZHOV",7)

打印的结果是它重复了all数组的至少7个字符,我很想知道为什么会发生这种情况,而我所缺少的是什么?

此打印结果为:

[['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', ''], ['Z', 'H', 'O', 'V', '', '', '']]

1 个答案:

答案 0 :(得分:1)

问题是这一行:

arr = [[""] * columns] * rows

这是Python的“陷阱”-表面上看起来像应该做一件事的一段代码,但实际上做的是完全不同的事情,尽管区别很小。

您想要的是一个包含rows个不同行的列表。您实际上得到的是一个包含许多对同一行的引用的列表。代码[""] * columns仅创建一个列表,因此,当您将第二行的值填写到该列表中时,它将覆盖先前存储在其中的第一行的值;那么第三行的值会覆盖第二行的值,依此类推,因为它们都是对同一列表的引用。

您可能会发现visualise the execution step-by-step有帮助,以了解发生了什么情况。此链接使用了非常出色的Python Tutor工具。


解决方案是显式创建rows个不同的列表:

arr = [[""] * columns for i in range(rows)]