如何使用备用字母值对列表列表进行排序,以保持与相邻数值的关联

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

每个字母值都与数值相关联,即IRAK392相关联(92,应该出现在IRAK3之后)和PTRX95相关联(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

【讨论】:

以上是关于如何使用备用字母值对列表列表进行排序,以保持与相邻数值的关联的主要内容,如果未能解决你的问题,请参考以下文章

使用空值对列表进行排序

根据另一个列表中的值对列表进行排序

排序包含字符串和整数的数组列表

如何根据属性值对对象列表进行排序

如何在页面加载时按字母顺序对 HTML 列表的内容进行排序? [复制]

如何比较包含非英文字符的 unicode 字符串以按字母顺序排序?