Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> фильтр для словарей 
:(
    Опции темы
pythonwin
Дата 25.8.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Пожалуйста, подскажите, есть ли у словарей аналог функции "filter"

написал, но хотелосьбы в одну строку:

Код

kw=dict(q1_1=1, q1_2=2, q1_3=3, w1_1=1, w1_2=2, w1_3=3б q1_1=10, q1_1=12)
a1={}
for x in range(len(kw.keys())):
    k=kw.keys()[x]
    if 'q1_' in k: a1.update({k:kw.values()[x]})




PM WWW GTalk Jabber   Вверх
albertn
Дата 25.8.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Код

kw=dict(q1_1=1, q1_2=2, q1_3=3, w1_1=1, w1_2=2, w1_3=3б q1_1=10, q1_1=12)

Интересная конструкция, первый раз такую вижу. У меня не работает.

А вообще я бы делал так:
Код

d = {'123':333,'32':3,'4123':32,'12':33}
reduce(lambda x,y:('123' in y) and x.update({y:d[y]}) or x,d.keys(),{})

Ну типа того
PM WWW ICQ   Вверх
pythonwin
Дата 25.8.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(albertn @  25.8.2006,  18:40 Найти цитируемый пост)
Интересная конструкция, первый раз такую вижу. У меня не работает.

Прошу, прощения - вот рабочий вариант:
Код

kw={'q1_1':1, 'q1_2':2, 'q1_3':3, 'w1_1':1, 'w1_2':2, 'w1_3':3, 'q1_1':10, 'q1_1':12}


Ключи могут повторяться.
PM WWW GTalk Jabber   Вверх
albertn
Дата 25.8.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(pythonwin @  25.8.2006,  11:51 Найти цитируемый пост)
Прошу, прощения - вот рабочий вариант:

Под него пример:
Код

kw={'q1_1':1, 'q1_2':2, 'q1_3':3, 'w1_1':1, 'w1_2':2, 'w1_3':3, 'q1_1':10, 'q1_1':12}
reduce(lambda x,y:('q1_' in y) and x.update({y:kw[y]}) or x,kw.keys(),{})

Цитата(pythonwin @  25.8.2006,  11:51 Найти цитируемый пост)
Ключи могут повторяться. 

А это как?
PM WWW ICQ   Вверх
pythonwin
Дата 25.8.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(albertn @  25.8.2006,  18:58 Найти цитируемый пост)
А это как? 


Код

kw={'q1_1':1, 'q1_2':2, 'q1_3':3, 'w1_1':1, 'w1_2':2, 'w1_3':3, 'q1_1':10, 'q1_1':12}

ключ 'q1_1' повторяется 3 раза.



Цитата(albertn @  25.8.2006,  18:58 Найти цитируемый пост)
Под него пример:

Спасибо!
PM WWW GTalk Jabber   Вверх
albertn
Дата 25.8.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(pythonwin @  25.8.2006,  12:01 Найти цитируемый пост)
ключ 'q1_1' повторяется 3 раза.

Так запоминается же только последний!
PM WWW ICQ   Вверх
pythonwin
Дата 25.8.2006, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



нужны все 5.
PM WWW GTalk Jabber   Вверх
albertn
Дата 25.8.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(pythonwin @ 25.8.2006,  12:09)
нужны все 5.

Вот эти две строчки эквивалентны, питон сам отрубает лишнее.
Код

{'q1_1':1, 'q1_2':2, 'q1_3':3, 'w1_1':1, 'w1_2':2, 'w1_3':3, 'q1_1':10, 'q1_1':12}
{'q1_3': 3, 'q1_1': 12, 'w1_1': 1, 'q1_2': 2, 'w1_3': 3, 'w1_2': 2}

Я все-равно не пойму в чем смысл? Зачем их повторять, чтобы затем отбросить?
PM WWW ICQ   Вверх
pythonwin
Дата 25.8.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



мне очень важно не потерять {'q1_1':1, 'q1_2':2}

Это сообщение отредактировал(а) pythonwin - 25.8.2006, 12:18
PM WWW GTalk Jabber   Вверх
albertn
Дата 25.8.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(pythonwin @ 25.8.2006,  12:16)
'q1_1':1, 'q1_2':2

Ну это собственно логично, ведь фильтр должен работать не только для одной записи
Ключи то недолжны изменяться

Это сообщение отредактировал(а) albertn - 25.8.2006, 12:20
PM WWW ICQ   Вверх
pythonwin
Дата 31.8.2006, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



А задача имеет решение?
PM WWW GTalk Jabber   Вверх
Artemios
Дата 1.9.2006, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



pythonwin, правильно заметил albertn, словарь с повторяющимися ключами тебе создать неудастся:
Код

>>> kw={'q1_1':1, 'q1_2':2, 'q1_3':3, 'w1_1':1, 'w1_2':2, 'w1_3':3, 'q1_1':10, 'q1_1':12}
>>> print kw
{'q1_3': 3, 'q1_1': 12, 'w1_1': 1, 'q1_2': 2, 'w1_3': 3, 'w1_2': 2}

Другой выход, вместо словаря использовать список пар или множество пар.


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
pythonwin
Дата 1.9.2006, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(Artemios @  1.9.2006,  07:37 Найти цитируемый пост)
Другой выход, вместо словаря использовать список пар или множество пар. 


Код

>>> kw={'q1_1':1, 'q1_2':2, 'q1_3':3, 'w1_1':1, 'w1_2':2, 'w1_3':3, 'q1_1':10, 'q1_1':12}
>>> kw.items()
[('q1_3', 3), ('q1_1', 12), ('w1_1', 1), ('q1_2', 2), ('w1_3', 3), ('w1_2', 2)]


Дело в том, что словарь у меня уже есть

Код

def fun1(**kw):
   # фильтр словаря
   pass
   return a1 #переменная, которая зависит от отфильтрованого словаря

PM WWW GTalk Jabber   Вверх
Artemios
Дата 1.9.2006, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Код

>>> def fun1(**kw):
        print kw

>>> fun1(a=1,a=2,b=3,b=4)
SyntaxError: duplicate keyword argument
>>> fun1(**{'a':1,'a':2,'b':3,'b':4})
{'a': 2, 'b': 4}


Цитата

Другой выход, вместо словаря использовать список пар или множество пар.

Возможный выход, вместо словаря изначально использовать список пар или множество пар, тебе же, как я понял, нужно одновременное присутствие и ('q1_1',1), и ('q1_1',12) .

Это сообщение отредактировал(а) Artemios - 1.9.2006, 11:13


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
pythonwin
Дата 1.9.2006, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Этот фильтр нужен для widgets и мотодов class Root в TurboGears. Там так сложно будет сделать сделать - проще и быстрее придумать фильтрацию. чем переписать TG smile

Это сообщение отредактировал(а) pythonwin - 1.9.2006, 11:17
PM WWW GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1067 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.