假设我有一个像这样的元组列表:
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新手。 THX!
答案 0 :(得分: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')]]
答案 1 :(得分: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')]
我只是亲自使用dict。简单的数据结构是最好的。
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')]
但那是我对所有事情的解决方案,所以也许我需要分一点。
答案 2 :(得分:0)
在这样的情况下我会做的是列表。
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()
来迭代“事物”E.g。
things["music"] = [('music','400','url'),('music','350','url'),('music','300','url')]