Python 将元组列表排序为多个列表的最佳方法和数据结构?

Python 将元组列表排序为多个列表的最佳方法和数据结构?,python,list,sorting,Python,List,Sorting,假设我有一个元组列表,如下所示: l = [('music','300','url'),('movie','400','url'), ('clothing','250','url'),('music','350','url'), ('music','400','url'),('movie','1000','url')] import itertools import operator sorted_l = sorted(l, key=lambda x: (x[0], int(x[1])),

假设我有一个元组列表,如下所示:

l = [('music','300','url'),('movie','400','url'),
('clothing','250','url'),('music','350','url'),
('music','400','url'),('movie','1000','url')]
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))]
我想将这些元组排序到多个列表中,每个列表按照元组中的第一个元素进行分组。此外,一旦分组到这些列表中,我希望新列表按第二个元素(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还是新手。谢谢

在这种情况下,我要做的是一本列表词典

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”

例如


在这种情况下,我要做的是一本列表词典

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”

例如


您可以这样做:

l = [('music','300','url'),('movie','400','url'),
('clothing','250','url'),('music','350','url'),
('music','400','url'),('movie','1000','url')]
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')]]

您可以这样做:

l = [('music','300','url'),('movie','400','url'),
('clothing','250','url'),('music','350','url'),
('music','400','url'),('movie','1000','url')]
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')]]

您可以通过列表理解轻松获取列表:

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')]
这会给你一些类似的东西:

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

但这是我的解决方案,所以我可能需要扩展一点。

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

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')]
这会给你一些类似的东西:

>>> 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方法,确保它在所有后续dict中都是正确的。我是不是遗漏了一些可能会绊倒我的东西?当然你可以这样做,每个键都是一个列表,这样你以后也可以对它们进行排序:
d['movie'].sort(key=lambda x:x[0])
,或者:
对于k in d:d[k]。sort(key=lambda x:x[0])
但是,如果你使用dict方法,提前排序可能是最好的解决方案,使您免于多次排序。出于我的目的,您的上一个解决方案仍然需要排序。在我的测试中,如果我只是先使用:l.sort(key=lambda x:x[1],reverse=True)对列表进行排序(在第二个元素上(作为int而不是字符串),然后使用您的dict方法,确保它在所有后续dict中都是正确的。我是不是遗漏了一些可能会绊倒我的东西?当然你可以这样做,每个键都是一个列表,这样你以后也可以对它们进行排序:
d['movie'].sort(key=lambda x:x[0])
,或者:
对于k in d:d[k]。sort(key=lambda x:x[0])
但是,如果你使用dict方法,提前排序可能是最好的解决方案,避免您多次排序。