лучший метод и структура данных для сортировки списка кортежей в несколько списков? - PullRequest
1 голос
/ 09 июня 2011

Допустим, у меня есть список таких кортежей:

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!

Ответы [ 3 ]

2 голосов
/ 09 июня 2011

Вы можете сделать что-то вроде этого:

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 голос
/ 09 июня 2011

Ну, вы можете легко получить свои списки с пониманием списка:

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')]

Но тогда это мое решение для всего, поэтому, возможно, мне нужно немного расшириться.

0 голосов
/ 09 июня 2011

В таком случае я бы сделал словарь списков.

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')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...