【问题标题】:best method and data structure for sorting a list of tuples into multiple lists?将元组列表排序为多个列表的最佳方法和数据结构?
【发布时间】:2011-06-09 16:23:00
【问题描述】:

假设我有一个这样的元组列表:

l = [('music','300','url'),('movie','400','url'),
('clothing','250','url'),('music','350','url'),
('music','400','url'),('movie','1000','url')]

并且我想将这些元组排序到多个列表中,每个列表都由元组中的第一个元素分组。此外,一旦分组到这些列表中,我希望新列表按第二个元素(int)反向排序。所以,结果是:

music = [('music','400','url'),('music','350','url'),('music','300','url')]
movie = [('movie','1000','url'),('movie','400','url')]
clothing = [('clothing','250','url')]

也许我可以放弃多个列表并制作一个元组列表列表?所以,我会得到:

sortedlist = [[('music','400','url'),('music','350','url'),('music','300','url')],
[('movie','1000','url'),('movie','400','url')],
[('clothing','250','url')]]

但即使在这种情况下,我如何让内部列表按第二个元素反向排序?

如果我说错了,请提及。我还是 Python 的新手。谢谢!

【问题讨论】:

    标签: python list sorting


    【解决方案1】:

    好吧,您可以通过列表理解轻松获得您的列表:

    music = [x for x in l if x[0] == 'music']
    movie = [x for x in l if x[0] == 'movie']
    clothing = [x for x in l if x[0] == 'clothing']
    

    你甚至可以就地排序

    >>> music.sort(key=lambda x: x[1], reverse=True)
    <<< [('music', '400', 'url'), ('music', '350', 'url'), ('music', '300', 'url')]
    

    我个人只会使用字典。简单的数据结构是最好的。

    from collections import defaultdict
    
    d = defaultdict(list)
    for x in l:
        d[x[0]].append(x[1:])
    

    这会给你类似的东西:

    >>> for k,v in d.iteritems():
    ...:     print k, v
    ...:
    ...:
    movie [('400', 'url'), ('1000', 'url')]
    clothing [('250', 'url')]
    music [('300', 'url'), ('350', 'url'), ('400', 'url')]
    

    但那是我对所有事情的解决方案,所以也许我需要扩展一点。

    【讨论】:

    • 您的最后一个解决方案仍然需要为我的目的进行排序。它出现在我的测试中,如果我首先使用:l.sort(key=lambda x: x[1], reverse=True) 对列表进行排序(在第二个元素上(作为 int 而非字符串)),然后使用你的 dict 方法,它在所有后续的 dicts 中都是正确的。我是否遗漏了一些可能会绊倒我的东西?
    • 当然可以,每个键都是一个列表,因此您以后也可以对它们进行就地排序:d['movie'].sort(key=lambda x: x[0]),或:for k in d: d[k].sort(key=lambda x: x[0])
    • 但是,预先对列表进行排序可能是最好的解决方案,如果您使用 dict 方法,可以避免多次排序。
    【解决方案2】:

    你可以这样做:

    import itertools
    import operator
    
    sorted_l = sorted(l, key=lambda x: (x[0], int(x[1])), reverse=True)
    
    print [list(g[1]) for g in itertools.groupby(sorted_l, key=operator.itemgetter(0))]
    

    输出:

    [[('music', '400', 'url'), ('music', '350', 'url'), ('music', '300', 'url')],
     [('movie', '1000', 'url'), ('movie', '400', 'url')],
     [('clothing', '250', 'url')]]
    

    【讨论】:

    • 我认为这不能正常工作,因为电影没有排序
    【解决方案3】:

    在这种情况下,我会做一个列表字典。

    things = {}
    
    for tuple in all_tuples:
        key = tuple[0]
        if not key in things:
            things[key] = [] # Initialize empty list
        things[key].append(tuple)
    

    然后您可以使用 things.keys() 或 things.values() 遍历“事物”

    例如

    things["music"] = [('music','400','url'),('music','350','url'),('music','300','url')]
    

    【讨论】:

      猜你喜欢
      • 2015-08-13
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 2013-06-22
      • 2017-10-15
      • 1970-01-01
      相关资源
      最近更新 更多