【问题标题】:Python sorting 2D Array of tuples in pythonPython对python中的二维元组数组进行排序
【发布时间】:2016-01-07 06:31:48
【问题描述】:

我是 python 新手并且有一个数组,其中每个元素都是一个元组数组。我需要按元组中的第一个元素对内部数组中的元组进行排序。我的数组看起来像这样:

[[(u'10:30', u'11:20'), (u'08:30', u'09:20')], [(u'14:30', u'15:50'), (u'10:00', u'11:20'), (u'10:30', u'11:20'), (u'13:00', u'14:20')], [(u'10:30', u'11:20'), (u'08:30', u'09:20')], [(u'14:30', u'15:50'), (u'10:00', u'11:20'), (u'13:00', u'14:20')], [(u'10:30', u'11:20'), (u'08:30', u'09:20')]]

我尝试做类似的事情

for index, elm in array:
    array[index] = sorted(elm, key=lambda x: x[0])

但我得到 ValueError: need more than 0 values to unpack。不确定我的语法是关闭还是什么

预期的结果是

  [[ (u'08:30', u'09:20'), (u'10:30', u'11:20')], [ (u'10:00', u'11:20'), (u'10:30', u'11:20'), (u'13:00', u'14:20'), (u'14:30', u'15:50')], [(u'08:30', u'09:20'),(u'10:30', u'11:20') ], [ (u'10:00', u'11:20'), (u'13:00', u'14:20'), (u'14:30', u'15:50'),] [ (u'08:30', u'09:20'), (u'10:30', u'11:20')]]

【问题讨论】:

    标签: python arrays list sorting tuples


    【解决方案1】:

    for 语句丢失enumerate

    for index, elm in enumerate(array):
    

    但是,如果您想对列表进行就地排序,则不需要使用 index.html。请改用list.sort

    for elm in array:                                                              
        elm.sort(key=lambda x: x[0])
    

    【讨论】:

    • @The6thSense,10:30 等字符串无法转换为int
    • 抱歉现在没有看到实际数据我有点怀疑是不是应该比普通字符串按时间排序?它提供了正确的输出,但这里的字符串比较是否足够?
    • @The6thSense,字符串按字典顺序排序。 '10:30' < '11:45'
    • @The6thSense:正常(字典)字符串排序将正确排序这些时间字符串,因为它们是零填充的。如果我们有像2:30 这样的时间,那么就会出现问题,因为例如,'2:30' > '10:30' 是 True。
    • @PM2Ring 嗯,是的,这是有道理的 :)。
    【解决方案2】:

    当您执行for index, elm in array: 时,您正在迭代成对的对象。在第一次循环迭代中,index(u'10:30', u'11:20')elm(u'08:30', u'09:20'),这不是您想要的(当我输入您发布的代码时,我得到的是 TypeError,而不是 ValueError)。您可以使用enumerate() 函数获得您计划的内容:

    for index, elm in enumerate(array):
        array[index] = sorted(elm, key=lambda x: x[0])
    

    【讨论】:

    • @The6thSense - 有一个前导零,所以没有必要。如果没有前导零,一个简单的int() 调用将不足以解析这些时间字符串。使用字符串格式添加前导零会更容易。
    • FWIW,当结果要替换原始列表时使用sorted 函数效率不高。那是因为sorted 将源列表复制到一个新列表并对该新列表进行就地排序。因此,在这种情况下,最好使用.sort() 方法直接进行就地排序。
    猜你喜欢
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2023-03-26
    • 1970-01-01
    • 2013-08-17
    相关资源
    最近更新 更多