首页 > 解决方案 > 如何根据多个键对多维列表进行排序?

问题描述

我有以下清单。

initial =[('fanitst', 257.72815, 43.42322), ('st', 47.82522, 51.149788), ('hird', 572.8713, 60.59974), ('irces', 710.9375, 61.953125), ('income', 35.546875, 111.71875), ('tax', 155.39062, 112.734375), ('department', 213.42479, 111.97105), ('govt', 577.8906, 116.796875), ('of', 690.625, 116.796875), ('india', 742.4219, 116.796875), ('hitu', 56.875, 169.60938), ('biswas', 135.0781, 169.60936), ('biswas', 197.03125, 243.75), ('haridas', 54.84375, 244.76562), ('in', 648.0486, 272.82794), ('n', 726.6486, 303.17294), ('051031920', 51.569546, 320.44266), ('number', 283.35938, 355.46875), ('account', 181.64876, 357.539), ('permanent', 52.67427, 359.5602), ('czkpb5432z', 53.38768, 399.7318), ('s', 842.3438, 427.73975), ('biswas', 125.9375, 468.20312), ('hilu', 59.921875, 469.21875), ('signature', 50.868423, 528.95844)]

每个项目基本上都是一个单词的元组,它是 x 坐标,它是 y 坐标。

我必须安排它们,使输出如下所示。它是由

  1. 将 y 坐标值彼此接近(例如小于 5)的所有单词分组。

  2. 然后,同一行中的单词应该根据它们的 x 坐标进行排序。

我该怎么做这第二部分?

fanitst
st
hird irces
income tax department govt of india
hitu biswas
haridas biswas
in
n
051031920
permanent account number 
czkpb5432z
s
biswas hilu

目前我得到以下输出。

fanitst
st
hird irces
income tax department govt of india
hitu biswas
biswas haridas
in
n
051031920
number account permanent
czkpb5432z
s
biswas hilu

我写到这里的代码如下。

for i in range(len(initial)-1):
    if abs(initial[i][2] - initial[i+1][2]) < 5:     
        print(initial[i][0], end=" ")
    else:
        print(initial[i][0])

如果我可以将输出的每一行存储在一个单独的列表中,我想我可以从那里继续前进。但是,我想不出一种将每一行存储在不同列表中的方法。每次列表的数量都会不同,所以我不知道我们需要多少个列表。

标签: pythonlistsortingmultidimensional-array

解决方案


这似乎有效:

initial =[('fanitst', 257.72815, 43.42322), ('st', 47.82522, 51.149788), ('hird', 572.8713, 60.59974), ('irces', 710.9375, 61.953125), ('income', 35.546875, 111.71875), ('tax', 155.39062, 112.734375), ('department', 213.42479, 111.97105), ('govt', 577.8906, 116.796875), ('of', 690.625, 116.796875), ('india', 742.4219, 116.796875), ('hitu', 56.875, 169.60938), ('biswas', 135.0781, 169.60936), ('biswas', 197.03125, 243.75), ('haridas', 54.84375, 244.76562), ('in', 648.0486, 272.82794), ('n', 726.6486, 303.17294), ('051031920', 51.569546, 320.44266), ('number', 283.35938, 355.46875), ('account', 181.64876, 357.539), ('permanent', 52.67427, 359.5602), ('czkpb5432z', 53.38768, 399.7318), ('s', 842.3438, 427.73975), ('biswas', 125.9375, 468.20312), ('hilu', 59.921875, 469.21875), ('signature', 50.868423, 528.95844)]

def group(lst):
    new = []
    i = 0
    while i < len(lst):
        if i == 0 or (not (abs(lst[i][2] - lst[i-1][2]) < 5)):
            new.append([])
        new[-1].append(lst[i])
        i += 1

    return new

def sort(lst):
    for row in lst:
        row.sort(key=lambda x: x[1])

lst = group(initial)
sort(lst)
print('\n'.join(' '.join(y[0] for y in x) for x in lst))

输出:

fanitst
st
hird irces
income tax department govt of india
hitu biswas
haridas biswas
in
n
051031920
permanent account number
czkpb5432z
s
hilu biswas
signature

推荐阅读