python - 如何根据多个键对多维列表进行排序?
问题描述
我有以下清单。
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 坐标。
我必须安排它们,使输出如下所示。它是由
将 y 坐标值彼此接近(例如小于 5)的所有单词分组。
然后,同一行中的单词应该根据它们的 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])
如果我可以将输出的每一行存储在一个单独的列表中,我想我可以从那里继续前进。但是,我想不出一种将每一行存储在不同列表中的方法。每次列表的数量都会不同,所以我不知道我们需要多少个列表。
解决方案
这似乎有效:
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
推荐阅读
- angular - Ubuntu没有在电子中显示最大化按钮
- ios - Ionic 应用程序 REST 响应数据未正确显示 iOS,Android 工作
- excel - 使用 Excel 公式查找特定产品的总销售额
- android - 这种内在方法最有可能是什么
- r - 如何将 mutate 命令与 if/if else 命令集成?
- django - Django 2.1/PostgreSQL - 我可以防止删除模型对象吗?
- python - 如果键在其他地方作为值出现,则从嵌套字典中删除键
- jenkins - 詹金斯:詹金斯版本更新后,工作没有开始
- javascript - 类型上不存在属性“数据”
| AxiosHttpResponse - datagrip - Datagrip 评论标题热键