我需要使用python加入列表和矩阵。
矩阵/ 2d列表包含列定义 - 列名和数据类型。右列位置不会对数据进行排序。
示例:
(Pdb) colmnAndDatatypeMatrix
[('col_b', 'number') , ('col_a','varchar')]
该列表仅包含列名,但它是正确排序的,这对我来说非常重要。
示例:
(Pdb) colmnList
['col_a', 'col_b']
我想要表演的内容:
我想订购矩阵/ 2d列表,因此它的排序方式与列表完全相同。当然,列表和矩阵包含相同列的名称。
如果是SQL,我只会加入这两个并查询列表中的列名(以便保留顺序)和来自连接的2d数组的类型。
如何在python中执行此操作?
答案 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。