【问题标题】:How to sort a list within a list within a list Python with names and values?如何使用名称和值对列表 Python 中的列表中的列表进行排序?
【发布时间】:2019-03-04 20:05:04
【问题描述】:

另一个列表索引问题(这对我来说有点棘手):

所以我创建了一个字典 (collections.defaultdict(list).

d = collections.defaultdict(list)
with arcpy.da.SearchCursor(fc, fields) as cursor :
    for roadname,x,y,bearing,e_id in cursor:
        d[roadname].append([x,y,bearing,e_id])

从这个字典中,我在列表中附加了一些数据。它有多个级别。

for row in d.items():
    #print(row[0][:])  # Name of the streets
    #print(row[1][:])  # List of values : x,y,heading and e_id
    #print(row[1][0][2])#Heading

#East heading
    if 45 <= row[1][0][2] <= 135:
        east_heading.append(row)
        print(str(row[0][:] + ' ==> Heading : East'))

列表中的第一个信息是街道名称。在此列表中,还有另一个列表包含多个信息(x、y、标题和一个空字段(暂时)。列表如下所示:

[('Adams_Street', [[-73.5073589207775, 45.38858418960871, 50.4474983215332, ''], [-73.50783911468335, 45.38868216265172, 50.4474983215332, ''], ('Archie_Street', [[-73.50561268197964, 45.38481501040445, 75.03119659423828, '']]) and so on...

每个子列表(街道名称)的长度彼此不同。

我正在尝试按 X 坐标对列表进行排序(例如:-73.5056...)。我可以通过这个循环获得所有值,但我不知道如何对其进行排序:

for entries in east_heading:
print(entries[1][0][0])

任何建议将不胜感激。

谢谢

【问题讨论】:

  • 目前这不是一个有效的数据结构。你有一个元组的开始,但没有结束。
  • 从你的问题中你不太清楚你想要什么。你想分别对每个子列表进行排序,还是对外部列表进行排序。例如。在您的示例中,是否应该对 Adams_Street 的所有条目进行排序,而对 Foo_street 的条目进行单独排序,或者您是否还希望对它进行排序,使得外部列表中 Adams_street 和 Foo_street 的顺序很重要?
  • 对不起,这不太容易描述。让我澄清一下:每条街道都有一个值的子列表,我需要对每条街道的这些值进行排序。这条街道出现在另一个列表中的顺序对我来说并不重要。

标签: python list dictionary indexing


【解决方案1】:

您应该能够在您的数组项上调用sort 函数。

您应该可以使用this 作为参考,但是对于您的问题,您可以这样做:

def sortFun(e):
    return e[0]

for entries in east_heading:
    entries[1].sort(key=sortFun)

print(sort)

这会根据最低 x 坐标将子数组的顺序更改为最高。使用.sort(reverse=True,key=sortFun) 将子数组的顺序从最高 x 坐标更改为最低。

例如,如果我制作了您的数据结构的可用副本

east_heading = [('tuple_a', [[4, 5, 7], [1, 2, 3]]),('tuple_b', [[7, 8, 9], [6, 19, 20]])]

然后按照上面设置的过程,它应该会产生这个输出

[('tuple_a', [[1, 2, 3],[4, 5, 7]]),('tuple_b', [[6, 19, 20],[7, 8, 9]])]

【讨论】:

  • 感谢 Kellan 的回答,但是当我运行此代码时,它不会对我的数据进行排序。事实上,如果我打印出条目[1][0],它会返回包含 4 个值的整个列表,因此不会对任何内容进行排序。但是,如果我打印出条目[1][0][0],它只会打印出我的 X 坐标。我不能这样做:返回 e[0][0] 因为浮点数不可下标
  • 没问题!很高兴我能帮上忙。如果这个答案确实有帮助,那么如果您可以将其标记为这样,那就太好了。
  • Maxime,您确定您的数据尚未排序吗? [('Adams_Street', [[-73.5073589207775, 45.38858418960871, 50.4474983215332, ''], [-73.50783911468335, 45.38868216265172, 50.4474983215332, '']) 可能已根据您的条件排序
  • 没关系,排序功能起作用了。漫长的一天,我很困惑。感谢您抽出时间凯兰。
  • 总是乐于助人。希望你漫长的一天变得更短!
【解决方案2】:

我不太确定我是否完全理解您要排序的数据,但如果是这样的话

l = [('Archie_Street', [[-73.50561268197964, 45.38481501040445, 75.03119659423828, '']]), ('Adams_Street', [[-73.5073589207775, 45.38858418960871, 50.4474983215332, ''], [-73.50783911468335, 45.38868216265172, 50.4474983215332, '']])]

如果您想按entry[1][0][0] 排序,那么我知道的最简单的方法是:

l_sorted = sorted(l, key = lambda x: x[1][0][0])

参考:Sort a list according to the second element in sublist

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多