如何使用备用字母值对列表列表进行排序,以保持与相邻数值的关联
Posted
技术标签:
【中文标题】如何使用备用字母值对列表列表进行排序,以保持与相邻数值的关联【英文标题】:How to sort list of lists with alternate alphabetical value maintaining the association with adjacent numeric values 【发布时间】:2020-01-07 07:38:33 【问题描述】:我有一个这样的列表的 python 列表
[['CCND1', '67', 'FAS', '99', 'IRAK3', '92', 'ALG14', '86', 'ADRBK1', '10'], ['PTRX', '95', 'CCNA', '33']]
每个字母值都与数值相关联,即IRAK3
和92
相关联(92
,应该出现在IRAK3
之后)和PTRX
和95
相关联(95
应该出现在PTRX
之后)。现在,我想按字母顺序对这个列表列表进行排序,以便排序后的列表如下所示:
[['ADRBK1', '10', 'ALG14', '86', 'CCND1', '67', 'FAS', '99', 'IRAK3', '92' ], ['CCNA', '33', 'PTRX', '95' ]]
请注意,在排序列表中,按字母顺序排列的值是按字母顺序排列的,但请注意,92
出现在IRAK3
之后,95
出现在PTRX
之后,即保持关联。
我该怎么做?
【问题讨论】:
为什么将关联值放在单独的列表元素中,而不是将它们组合成元组或字典? 您在哪个特定部分遇到问题?我建议将("ADRBK1", "10")
分成两对并对其进行排序,然后再次将其展平。
列表通常应该是同质的。将元组和字典用于相关数据的异构集合。
到目前为止你尝试过什么? SO 不是代码编写服务
这个问题很清楚。不要因为不清楚就关闭它。 (见证三个中肯的答案。)如果你不喜欢零努力,那就投反对票吧。
【参考方案1】:
这是一种方法。
例如:
from itertools import chain
data = [['CCND1', '67', 'FAS', '99', 'IRAK3', '92', 'ALG14', '86', 'ADRBK1', '10'], ['PTRX', '95', 'CCNA', '33']]
#pair elements --> [('CCND1', '67'), ('FAS', '99')....
data = [zip(i[::2], i[1::2]) for i in data]
#sort and flatten
data = [list(chain.from_iterable(sorted(i, key=lambda x: x[0]))) for i in data]
print(data)
【讨论】:
【参考方案2】:“列表通常应该是同质的。对相关数据的异构集合使用元组和字典。” [1]
一种方法是将它们排列为元组,然后对它们进行排序也会更容易。
mylist = [['CCND1', '67', 'FAS', '99', 'IRAK3', '92', 'ALG14', '86', 'ADRBK1', '10'], ['PTRX', '95', 'CCNA', '33']]
list_of_tuples = []
for l in mylist:
if len(l) % 2 is not 0:
raise ValueError()
list_of_tuples.append([(l[i], l[i+1]) for i in range(0, len(l), 2)])
for l in list_of_tuples:
l.sort(key=lambda tup: tup[0])
print(list_of_tuples)
# [[('ADRBK1', '10'), ('ALG14', '86'), ('CCND1', '67'), ('FAS', '99'), ('IRAK3', '92')], [('CCNA', '33'), ('PTRX', '95')]]
【讨论】:
这只“有效”,因为你给它的输入已经排序!【参考方案3】:你可以试试这个:
>>> list_ = [['CCND1', '67', 'FAS', '99', 'IRAK3', '92', 'ALG14', '86', 'ADRBK1', '10'], ['PTRX', '95', 'CCNA', '33']]
>>> paired_list = (zip(*[iter(l)]*2) for l in list_)
>>> sorted_list = [list(sum(sorted(l, key=lambda x: x[0]),())) for l in paired_list]
>>> sorted_list
[['ADRBK1', '10', 'ALG14', '86', 'CCND1', '67', 'FAS', '99', 'IRAK3', '92'],
['CCNA', '33', 'PTRX', '95']]
参考资料:
zip(*[iter(iterable)]*n)
sorted
我用过sum
to concatenate the list of tuples。但是,如果您准备使用其他模块,最好使用itertools.chain.from_iterables
。
【讨论】:
以上是关于如何使用备用字母值对列表列表进行排序,以保持与相邻数值的关联的主要内容,如果未能解决你的问题,请参考以下文章