Python 最好的方法是根据元组的第一个元素重新排列元组列表,以匹配字符串?
我有一个元组列表,如下所示:Python 最好的方法是根据元组的第一个元素重新排列元组列表,以匹配字符串?,python,string,list,sorting,match,Python,String,List,Sorting,Match,我有一个元组列表,如下所示: [(['A', 'E', 'J', 'M', 'S'],), (['E', 'C', 'D', 'A', 'A'],), (['F', 'B', 'F', 'C', 'C'],)] 或者,如果更简单的话,在我使用zip之前,它看起来是这样的: [['A', 'E', 'J', 'M', 'S'], ['E', 'C', 'D', 'A', 'A'], ['F', 'B', 'F', 'C', 'C']] 我正试图重新排列最上面的一行,使其显示为J A m E S
[(['A', 'E', 'J', 'M', 'S'],), (['E', 'C', 'D', 'A', 'A'],), (['F', 'B', 'F', 'C', 'C'],)]
或者,如果更简单的话,在我使用zip之前,它看起来是这样的:
[['A', 'E', 'J', 'M', 'S'],
['E', 'C', 'D', 'A', 'A'],
['F', 'B', 'F', 'C', 'C']]
我正试图重新排列最上面的一行,使其显示为J A m E S,并让下面的几行跟随。最好的办法是什么。谢谢你的帮助
我的目标输出是
[['J', 'A', 'M', 'E', 'S'],
['D', 'E', 'A', 'C', 'A'],
['F', 'F', 'C', 'B', 'C']]
假设手动排列第一行,则创建一个numpy.ndarray,并使用手动选择的索引数组对其进行切片:
In [117]: a=np.array([['A', 'E', 'J', 'M', 'S'],
...: ['E', 'C', 'D', 'A', 'A'],
...: ['F', 'B', 'F', 'C', 'C']])
In [118]: idx=[2,0,3,1,4] #index array
In [119]: a[:,idx]
Out[119]:
array([['J', 'A', 'M', 'E', 'S'],
['D', 'E', 'A', 'C', 'A'],
['F', 'F', 'C', 'B', 'C']],
dtype='|S1')
假设手动排列第一行,则创建一个numpy.ndarray,并使用手动选择的索引数组对其进行切片:
In [117]: a=np.array([['A', 'E', 'J', 'M', 'S'],
...: ['E', 'C', 'D', 'A', 'A'],
...: ['F', 'B', 'F', 'C', 'C']])
In [118]: idx=[2,0,3,1,4] #index array
In [119]: a[:,idx]
Out[119]:
array([['J', 'A', 'M', 'E', 'S'],
['D', 'E', 'A', 'C', 'A'],
['F', 'F', 'C', 'B', 'C']],
dtype='|S1')
创建包含“J”、“a”、“M”等键的词典。。指向一些数字以获得所需的顺序,然后使用此字典对解压缩的versionzip*进行排序。。你的名单
>>> lis = [['A', 'E', 'J', 'M', 'S'],
['E', 'C', 'D', 'A', 'A'],
['F', 'B', 'F', 'C', 'C']]
>>> d = {'J':0, 'A':1, 'M':2, 'E':3, 'S':4}
>>> zip(*sorted(zip(*lis), key= lambda x: (d[x[0]])))
[('J', 'A', 'M', 'E', 'S'), ('D', 'E', 'A', 'C', 'A'), ('F', 'F', 'C', 'B', 'C')]
创建包含“J”、“a”、“M”等键的词典。。指向一些数字以获得所需的顺序,然后使用此字典对解压缩的versionzip*进行排序。。你的名单
>>> lis = [['A', 'E', 'J', 'M', 'S'],
['E', 'C', 'D', 'A', 'A'],
['F', 'B', 'F', 'C', 'C']]
>>> d = {'J':0, 'A':1, 'M':2, 'E':3, 'S':4}
>>> zip(*sorted(zip(*lis), key= lambda x: (d[x[0]])))
[('J', 'A', 'M', 'E', 'S'), ('D', 'E', 'A', 'C', 'A'), ('F', 'F', 'C', 'B', 'C')]
您希望将数据与排序键关联,排序,然后按顺序提取数据。或多或少的DSU。在本例中,zip是一种快速“交叉”矩阵的方法,因此压缩元组,按照您的意愿进行排序。。。在下面的示例中,我使用了一个固定的映射,因为我不知道您的排序标准,请使用另一种方式:
input = [['A', 'E', 'J', 'M', 'S'],
['E', 'C', 'D', 'A', 'A'],
['F', 'B', 'F', 'C', 'C']]
input_zip = zip(*input)
print input_zip
[('A', 'E', 'F'),
('E', 'C', 'B'),
('J', 'D', 'F'),
('M', 'A', 'C'),
('S', 'A', 'C')]
indices = [2,0,3,1,4]
output = [input_zip[x] for x in indices]
[('J', 'D', 'F'),
('A', 'E', 'F'),
('M', 'A', 'C'),
('E', 'C', 'B'),
('S', 'A', 'C')]
# Zip it the other way now.
output_zip = zip(*output)
[('J', 'A', 'M', 'E', 'S'),
('D', 'E', 'A', 'C', 'A'),
('F', 'F', 'C', 'B', 'C')]
希望这不仅能回答问题,还能解释其背后的思想。您希望将数据与排序键关联,排序,然后按顺序提取数据。或多或少的DSU。在本例中,zip是一种快速“交叉”矩阵的方法,因此压缩元组,按照您的意愿进行排序。。。在下面的示例中,我使用了一个固定的映射,因为我不知道您的排序标准,请使用另一种方式:
input = [['A', 'E', 'J', 'M', 'S'],
['E', 'C', 'D', 'A', 'A'],
['F', 'B', 'F', 'C', 'C']]
input_zip = zip(*input)
print input_zip
[('A', 'E', 'F'),
('E', 'C', 'B'),
('J', 'D', 'F'),
('M', 'A', 'C'),
('S', 'A', 'C')]
indices = [2,0,3,1,4]
output = [input_zip[x] for x in indices]
[('J', 'D', 'F'),
('A', 'E', 'F'),
('M', 'A', 'C'),
('E', 'C', 'B'),
('S', 'A', 'C')]
# Zip it the other way now.
output_zip = zip(*output)
[('J', 'A', 'M', 'E', 'S'),
('D', 'E', 'A', 'C', 'A'),
('F', 'F', 'C', 'B', 'C')]
希望这不仅能回答问题,还能解释其背后的思想。因此,听起来您想要的是首先对数据进行排序,以便将每个列表中的对应元素放入其所属的列表中,因此:
input = [['A', 'E', 'J', 'M', 'S'],
['E', 'C', 'D', 'A', 'A'],
['F', 'B', 'F', 'C', 'C']]
rearrangedlist = [[input[x][y] for x in range(len(input))] for y in range(len(input[0]))]
# Gives rearrangedlist = [['A', 'E', 'F'],
['E', 'C', 'B'],
['J', 'D', 'F'],
['M', 'A', 'C'],
['S', 'A', 'C']]
然后:
给出:
['J', 'D', 'F']
['A', 'E', 'F']
['M', 'A', 'C']
['E', 'C', 'B']
['S', 'A', 'C']
因此,听起来您想要的是首先对数据进行排序,以便将每个列表中的对应元素包含在其所属的列表中,因此:
input = [['A', 'E', 'J', 'M', 'S'],
['E', 'C', 'D', 'A', 'A'],
['F', 'B', 'F', 'C', 'C']]
rearrangedlist = [[input[x][y] for x in range(len(input))] for y in range(len(input[0]))]
# Gives rearrangedlist = [['A', 'E', 'F'],
['E', 'C', 'B'],
['J', 'D', 'F'],
['M', 'A', 'C'],
['S', 'A', 'C']]
然后:
给出:
['J', 'D', 'F']
['A', 'E', 'F']
['M', 'A', 'C']
['E', 'C', 'B']
['S', 'A', 'C']
您是手动执行此操作,还是使用某种算法重新排列第一个列表?其他两个列表的排序标准是什么?其他两个列表只需与它们相对于顶部列表的位置相匹配。整个程序是一个加密脚本,JAMES列表之后的两个列表用作密钥。您是手动执行此操作,还是使用某种算法重新排列第一个列表?其他两个列表的排序标准是什么?其他两个列表只需与它们相对于顶部列表的位置相匹配。整个程序是一个加密脚本,JAMES列表后的2个列表用作密钥。