Уведомления

Группа в Telegram: @pythonsu

#1 Март 22, 2013 23:07:01

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Сортировка словаря

Я понял так

def strange_sort(items):
    unique = sorted(set(items))
    return [unique[i % len(unique)] for i in range(len(items))]
 
items = [1, 2, 2, 2, 2, 1, 1, 1, 3, 3, 3, 3]
print strange_sort(items)  # [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]

Отредактировано reclosedev (Март 22, 2013 23:08:23)

Офлайн

#2 Март 22, 2013 23:30:14

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Сортировка словаря

Если количество может быть разным:

from collections import Counter
 
def strange_sort(items):
    count = Counter(items)
    unique = sorted(count.keys())
    result = []
    while count:
        for item in unique:
            count[item] -= 1
            if count[item] < 0:
                del count[item]
            else:
                result.append(item)
    return result
 
items = [1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 3, 3, 3, 3]
print strange_sort(items)  # [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 1, 1]
Возможно, есть способ проще.

Офлайн

#3 Март 23, 2013 00:53:03

Saturn
От:
Зарегистрирован: 2012-03-22
Сообщения: 164
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря

reclosedev
Спасибо большое, а то я уже столько вариантов пробовал но никак не получалось.
Это то что, надо включая второй результат поскольку есть вероятность разного количества.



Офлайн

#4 Март 23, 2013 06:01:12

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10019
Репутация: +  857  -
Профиль   Отправить e-mail  

Сортировка словаря

>>> date = ['aaa', 'ddd', 'ddd', 'ddd', 'ddd', 'aaa', 'aaa', 'aaa', 'ccc', 'ccc', 'ccc', 'ccc']
>>> 
>>> def f(lst):
...     out = []
...     uni = set()
...     for i in lst:
...         if i not in uni:
...             uni.add(i)
...             out.append(i)
...     return len(lst) // len(out) * out
... 
>>> print(f(date))
['aaa', 'ddd', 'ccc', 'aaa', 'ddd', 'ccc', 'aaa', 'ddd', 'ccc', 'aaa', 'ddd', 'ccc']
>>>
это вот без sorted(), как в первом сообщении, с учётом поправки про количество



Офлайн

#5 Март 23, 2013 11:42:50

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Сортировка словаря

>>> from itertools import chain, izip_longest, groupby
>>> date = ['aaa', 'ddd', 'aaa', 'aaa', 'aaa', 'ccc', 'ccc']
>>> filter(None, chain.from_iterable(izip_longest(*(list(x[1]) for x in groupby(sorted(date))))))
['aaa', 'ccc', 'ddd', 'aaa', 'ccc', 'aaa', 'aaa'

Офлайн

#6 Март 23, 2013 12:11:08

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10019
Репутация: +  857  -
Профиль   Отправить e-mail  

Сортировка словаря

ему надо a d c, а не a c d (это в первом сообщении)



Офлайн

#7 Март 23, 2013 14:21:38

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Сортировка словаря

Ну тогда мой вариант ошибочен.

Офлайн

#8 Март 23, 2013 17:27:04

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Сортировка словаря

Так и не понял какой результат нужен. Думаю, у py.user.next правильнее.

Для чего это используется?

Офлайн

#9 Апрель 8, 2013 22:27:51

Saturn
От:
Зарегистрирован: 2012-03-22
Сообщения: 164
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря

Спасибо большое всем за помощь, самый нужный вариант написал lorien

Для чего это используется?

Попробую описать суть…
В таблице есть поле site. Есть 3 вида (url) сайтов.
0.5 млн строк в таблице.
Вот для того чтобы вытащить из таблицы 30 строк мне нужно сделать 3 отдельных запроса.
К примеру:
SELECT * FROM table WHERE site='example1.com LIMIT 0,10';
SELECT * FROM table WHERE site='example2.com LIMIT 0,10';
SELECT * FROM table WHERE site='example3.com LIMIT 0,10';
Если учесть что данные в таблице находятся не по порядку по отношению к site.
В результате данные с запросов нужно отфильтровать чтобы получилось по порядку.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version