【问题标题】:Appending a value to start of list将值附加到列表的开头
【发布时间】:2015-02-04 17:20:55
【问题描述】:

目前正在研究 Python 中的 2D 转置密码。所以我有一个包含编码消息的列表,如下所示:

['BF', 'AF', 'AF', 'DA', 'CD', 'DD', 'BC', 'EF', 'DA', 'AA', 'EF', 'BF']

下一步是获取该列表,将其拆分并根据用户输入的关键字将其放入一个新矩阵中。我在下面:

Enter the keyword for final encryption: hide
  H    I    D    E
['B', 'F', 'A', 'F']
['A', 'F', 'D', 'A']
['C', 'D', 'D', 'D']
['B', 'C', 'E', 'F']
['D', 'A', 'A', 'A']
['E', 'F', 'B', 'F']

接下来我想做但没有做的事情是获取上面的每一列并按字母顺序打印它们,因此得到另一个密文,如下所示:

  D    E    H    I
['A', 'F', 'B', 'F']
['D', 'A', 'A', 'F']
['D', 'D', 'C', 'D']
['E', 'F', 'B', 'C']
['A', 'A', 'D', 'A']
['B', 'F', 'E', 'F']

这是我的代码:

def encodeFinalCipher():
    matrix2 = []
    # Convert keyword to upper case
    keywordKey = list(keyword.upper())

    # Convert firstEncryption to a string
    firstEncryptionString = ''.join(str(x) for x in firstEncryption)

    # Print the first table that will show the firstEncryption and the keyword above it
    keywordList = list(firstEncryptionString)
    for x in range(0,len(keywordList),len(keyword)):
        matrix2.append(list(keywordList[x:x+len(keyword)]))

    # Print the matrix to the screen
    print ('  %s' % '    '.join(map(str, keywordKey)))
    for letters in matrix2:
        print (letters)

    return finalEncryption

我已经遍历了 2D 矩阵并得到了所有列条目,如下所示:

    b = [[matrix2[i][j] for i in range(len(matrix2))] for j in range(len(matrix2[0]))]
    for index, item in enumerate (b):
        print("\n",index, item)

OUTPUT:------
 0 ['B', 'A', 'C', 'B', 'D', 'E']

 1 ['F', 'F', 'D', 'C', 'A', 'F']

 2 ['A', 'D', 'D', 'E', 'A', 'B']

 3 ['F', 'A', 'D', 'F', 'A', 'F']

如何将keywordKey的每个字母(例如'H''I''D''E')附加到数字0、1、2、3所在的列表中?

或者可能是更有效的解决方案。创建矩阵时如何将字母放入keywordKey列?字典在这里有用吗?然后我可以对字典进行排序并打印最终的密码。

非常感谢

【问题讨论】:

    标签: python list encryption transpose


    【解决方案1】:

    你可以这样做:

    >>> from operator import itemgetter
    >>> from pprint import pprint
    >>> lst = [['B', 'F', 'A', 'F'],
    ['A', 'F', 'D', 'A'],
    ['C', 'D', 'D', 'D'],
    ['B', 'C', 'E', 'F'],
    ['D', 'A', 'A', 'A'],
    ['E', 'F', 'B', 'F']]
    >>> key = 'HIDE'
    

    使用key 中的相应值对xrange(len(key))range(len(key)) 进行排序,然后您将获得一个索引列表:

    >>> indices = sorted(xrange(len(key)), key=key.__getitem__)
    >>> indices
    [2, 3, 0, 1]
    

    现在我们需要做的就是遍历列表并使用 operator.itemgetter 将这些索引应用于每个项目并获取相应的项目:

    >>> pprint([list(itemgetter(*indices)(x)) for x in lst])
    [['A', 'F', 'B', 'F'],
     ['D', 'A', 'A', 'F'],
     ['D', 'D', 'C', 'D'],
     ['E', 'F', 'B', 'C'],
     ['A', 'A', 'D', 'A'],
     ['B', 'F', 'E', 'F']]
    #or simply
    >>> pprint([[x[i] for i in indices] for x in lst])
    [['A', 'F', 'B', 'F'],
     ['D', 'A', 'A', 'F'],
     ['D', 'D', 'C', 'D'],
     ['E', 'F', 'B', 'C'],
     ['A', 'A', 'D', 'A'],
     ['B', 'F', 'E', 'F']]
    

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      相关资源
      最近更新 更多