按关键字对列表进行排序

4

目前正在处理一个置换问题。我已经做了这样的事情:用户输入消息,该消息被加密成一个列表,如下所示:

 ['BC', 'DE', 'DE', 'DA', 'FD', 'DD', 'BE', 'FE', 'DA', 'EA', 'FE', 'BC']

下一步我要做的是将这个密码进一步转化为一个表格,表格的密钥由用户输入。例如,如果用户输入'CODE',则输出结果如下:
2: Enter the keyword for final encryption: code
   C    O    D    E 
 ['B', 'C', 'D', 'E']
 ['D', 'E', 'D', 'A']
 ['F', 'D', 'D', 'D']
 ['B', 'E', 'F', 'E']
 ['D', 'A', 'E', 'A']
 ['F', 'E', 'B', 'C']

下一步是获取每列的每个值,并打印出对应字母列的值。因此,我期望的输出结果是:
   C    D    E    O 
 ['B', 'D', 'E', 'C']
 ['D', 'D', 'A', 'E']
 ['F', 'D', 'D', 'D']
 ['B', 'F', 'E', 'E']
 ['D', 'E', 'A', 'A']
 ['F', 'B', 'C', 'E']

我遇到的问题是如何将每个值放入其对应的列并打印它们。以下是我目前的代码:
def encodeFinalCipher():
    matrix2 = []
    # Convert keyword to upper case
    key = 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 un-ordered matrix to the screen
    print ('  %s' % '    '.join(map(str, key)))
    for letters in matrix2:
        print (letters)

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

    index = sorted(key)
    print(index)

我得到了排序后的键的输出:
['A', 'K', 'M', 'R']

我想知道如何将这个排序后的键应用到它们所代表的值上?我知道可以通过以下方式获取第一列:
print(unOrderedMatrix[0])

这将为我提供第一列的列表。非常感谢您的帮助。作为Python的完全新手,任何帮助都将不胜感激。

所以你期望的输出是 [[C,D,E,O],[B,C,D,E],[A,D,E,E],[D,D,D,F].... 因为你说要按字母顺序排列? - Tanveer Alam
我正在尝试输出与“C”、“D”等相对应的值,就像第二个矩阵一样。 - Bellos
4个回答

1

以下是一些帮助你入门的内容(你可能需要将循环的一行代码拆分成较小的部分):

# define data
data =  [['B', 'C', 'D', 'E'], ['D', 'E', 'D', 'A'], ['F', 'D', 'D', 'D'], ['B', 'E', 'F', 'E'], ['D', 'A', 'E', 'A'], ['F', 'E', 'B', 'C']]

# choose code word
code = 'code'

# add original locations to code word [(0, c), (1, o), (2, d), (3, e))]
# and sort them alphabetically!
code_with_locations = list(sorted(enumerate(code)))

print code_with_locations # [(0, 'c'), (2, 'd'), (3, 'e'), (1, 'o')]

# re-organize data according to new indexing
for index in range(len(data)):
    # check if code is shorter than list in current index,
    # or the other way around, don't exceed either list
    max_substitutions = min(map(len, [code_with_locations, data[index]]))

    # create a new list according to new indices
    new_list = []
    for i in range(max_substitutions):
        current_index = code_with_locations[i][0]
        new_list.append(data[index][current_index])

    # replace old list with new list
    data[index] = new_list


print data

'code'的输出将是:

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

1
code = raw_input("Enter the keyword for final encryption:")

user_input = ['BC', 'DE', 'DE', 'DA', 'FD', 'DD', 'BE', 'FE', 'DA', 'EA', 'FE', 'BC']
user_input = ''.join(user_input)

matrix = [user_input[i:i+len(code)] for i in range(0, len(user_input), len(code))]
matrix.insert(0, code)

result = sorted([[matrix[j][ind] for j in range(len(matrix))] for ind in range(len(code)) ], key= lambda i:i[0])
for row in [[each[ind] for each in result] for ind in range(len(result[0]))]:
    print row

row 的结果打印为:

Enter the keyword for final encryption:CODE
['C', 'D', 'E', 'O']
['B', 'D', 'E', 'C']
['D', 'D', 'A', 'E']
['F', 'D', 'D', 'D']
['B', 'F', 'E', 'E']
['D', 'E', 'A', 'A']
['F', 'B', 'C', 'E']

1
msg = ['BC', 'DE', 'DE', 'DA', 'FD', 'DD', 'BE', 'FE', 'DA', 'EA', 'FE', 'BC', '12']
key = 'CODE'
# 'flatten' the message
msg = ''.join(msg)
key_length = len(key)
#create a dictionary with the letters of the key as the keys
#use a slice to create the values
columns = {k:msg[i::key_length] for i, k in enumerate(key)}
print columns
# sort the columns on the key letters
columns = sorted(columns.items())
print columns
# separate the key from the columnar data
header, data = zip(*columns)
print header
# transpose and print
for thing in zip(*data):
    print thing

>>>
{'C': 'BDFBDF1', 'E': 'EADEAC', 'D': 'DDDFEB', 'O': 'CEDEAE2'}
[('C', 'BDFBDF1'), ('D', 'DDDFEB'), ('E', 'EADEAC'), ('O', 'CEDEAE2')]
('C', 'D', 'E', 'O')
('B', 'D', 'E', 'C')
('D', 'D', 'A', 'E')
('F', 'D', 'D', 'D')
('B', 'F', 'E', 'E')
('D', 'E', 'A', 'A')
('F', 'B', 'C', 'E')
>>> 

0

借助于 itertools

from pprint import pprint
from itertools import chain, izip_longest
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

z = ['BC', 'DE', 'DE', 'DA', 'FD', 'DD', 'BE', 'FE', 'DA', 'EA', 'FE', 'BC']
input = 'CODE'
pprint([[b for (a, b) in sorted(zip(input, x))] 
            for x in grouper(chain.from_iterable(z), len(input))])
[['B', 'D', 'E', 'C'],
 ['D', 'D', 'A', 'E'],
 ['F', 'D', 'D', 'D'],
 ['B', 'F', 'E', 'E'],
 ['D', 'E', 'A', 'A'],
 ['F', 'B', 'C', 'E']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接