最好的方法是根据元组的第一个元素重新排列元组列表,以匹配字符串?

2024-04-18 19:03:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个元组列表,看起来像:

[(['A', 'E', 'J', 'M', 'S'],), (['E', 'C', 'D', 'A', 'A'],), (['F', 'B', 'F', 'C', 'C'],)]

或者更简单一些,在我使用zip()之前,它看起来像这样:

^{pr2}$

我试图重新排序最上面的一行,这样它就可以读到J A m E S了,下面的行就跟在后面了。最好的办法是什么。谢谢你的帮助。在

我的目标是

[['J', 'A', 'M', 'E', 'S'],
['D', 'E', 'A', 'C', 'A'],
['F', 'F', 'C', 'B', 'C']]

Tags: 目标列表排序zip元组办法pr2
3条回答

创建一个包含'J''A''M'、。。指向一些数字以获得所需的顺序,然后使用此词典对列表的解压缩版本(zip(*..))进行排序。在

>>> 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')]

希望这不只是回答问题,而是解释背后的想法。在

假设您手动排列第一行,将aanumpy.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')

相关问题 更多 >