给定一个带有排序值

时间:2016-02-09 14:07:45

标签: python list sorting

我需要使用python加入列表和矩阵。

矩阵/ 2d列表包含列定义 - 列名和数据类型。右列位置不会对数据进行排序。

示例:

(Pdb) colmnAndDatatypeMatrix

[('col_b', 'number') , ('col_a','varchar')]

该列表仅包含列名,但它是正确排序的,这对我来说非常重要。

示例:

(Pdb) colmnList
['col_a', 'col_b']

我想要表演的内容:

我想订购矩阵/ 2d列表,因此它的排序方式与列表完全相同。当然,列表和矩阵包含相同列的名称。

如果是SQL,我只会加入这两个并查询列表中的列名(以便保留顺序)和来自连接的2d数组的类型。

如何在python中执行此操作?

2 个答案:

答案 0 :(得分:2)

您可以使用已排序的标准函数的密钥参数(自Python 2.4起可用):

matrix = [('col_b', 'number') , ('col_a','varchar')]
colmnList = ['col_a', 'col_b']

# Sort the matrix using as creiteria the position of the element in colmnList
sorted_matrix = sorted(matrix, key = lambda item: colmnList.index(item[0]))

print(matrix)
print(sorted_matrix)

>>> [('col_b', 'number'), ('col_a', 'varchar')]
>>> [('col_a', 'varchar'), ('col_b', 'number')]

参考:Sorting Mini-HOW TO, Key functions

旧答案

简单来说,它可能是更好的解决方案,但这肯定会解决您的问题,只需使用colmnList创建另一个矩阵。

matrix = [('col_b', 'number') , ('col_a','varchar')]
colmnList = ['col_a', 'col_b']

ordered_matrix = []

for col_name in colmnList:
    for elem in matrix:
        if elem[0] == col_name:
            ordered_matrix.append(elem)
            break # There is no need to iterate again here.


print(matrix)
print(ordered_matrix)

>>> [('col_b', 'number'), ('col_a', 'varchar')]
>>> [('col_a', 'varchar'), ('col_b', 'number')]

答案 1 :(得分:2)

作为使用OrderedDicts的快速解决方法,我建议如下:

from collections import OrderedDict

# list of tuples (what you called matrix)
m = [('col_b', 'number') , ('col_a','varchar')]

# list with ordered keys (will be used for sorting)
l = ['col_a', 'col_b']

# create OrderedDict from list `m`
od = OrderedDict(m)

# define a function to order the keys of an OrderedDict by a given list
def sort_by_list(d, l):
    for key in l:
        d.move_to_end(key)

# call function defined above in order to sort keys of OrderedDict `od` by list `l`
sort_by_list(od, l)

# print OrderedDict after we sorted the keys
print(od)

# print sorted list/matrix after sorting using workaround with OrderedDict
sorted = list(od.items())
print(sorted)

请注意,此方法仅适用于Python 3.2及更高版本,并且基于此answer