【问题标题】:How to sort a multidimensional list based on multiple keys? [closed]如何根据多个键对多维列表进行排序? [关闭]
【发布时间】:2020-05-31 18:11:15
【问题描述】:

我有以下清单。

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

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

【问题讨论】:

    标签: python list sorting multidimensional-array


    【解决方案1】:

    这似乎有效:

    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
    

    【讨论】:

    • 这对我来说非常有效。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多