Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 22, 2011 12:12:00

Goliath
От:
Зарегистрирован: 2011-09-22
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Список элементов словарей без повторения значения ключа

Я создал функцию

 def UniqueVariables( self, locations ):
tmp_locs = []
for loc in locations:
flag = False
if len( tmp_locs ) > 0:
for k in tmp_locs:
if loc[ "NAME" ] == k[ "NAME" ]:
flag = True
if flag == False:
tmp_locs.append( loc )
return tmp_locs
В locations содержится список словарей, необходимо при обходе списка удалить те элементы, для которых элементы со значением ключа NAME уже были. Т.е. грубо говоря должен быть список словарей элементов без повторения значения ключа NAME.
Например на входе в функцию в locations содержится:
{ ‘NAME’: ‘__Q1’, ‘SIZE’: ‘X’}
{ ‘NAME’: ‘__Q3’, ‘SIZE’: ‘X’}
{ ‘NAME’: ‘__Q2’, ‘SIZE’: ‘X’}
{ ‘NAME’: ‘__Q1’, ‘SIZE’: ‘Y’}
{ ‘NAME’: ‘__Q3’, ‘SIZE’: ‘I’}

После её выполнения:
locations = UniqueVariables( locations  )
В locations должно быть так:
{ ‘NAME’: ‘__Q1’, ‘SIZE’: ‘X’}
{ ‘NAME’: ‘__Q3’, ‘SIZE’: ‘X’}
{ ‘NAME’: ‘__Q2’, ‘SIZE’: ‘X’}
Всё нормально работает
Как оптимизровать мою функцию? выглядит как-то не очень, на мой взгляд



Офлайн

#2 Дек. 22, 2011 12:36:02

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Список элементов словарей без повторения значения ключа

def UniqueVariables( self, locations ):
return list({k['NAME']:k for k in reversed(locations)}.values())



Офлайн

#3 Дек. 22, 2011 18:09:49

Goliath
От:
Зарегистрирован: 2011-09-22
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Список элементов словарей без повторения значения ключа

Isem
def UniqueVariables( self, locations ):
return list({k['NAME']:k for k in reversed(locations)}.values())
return list( { k : k for k in locations }.values() )
^
SyntaxError: invalid syntax



Офлайн

#4 Дек. 22, 2011 19:15:53

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Список элементов словарей без повторения значения ключа

А мне кажется, что тут стоит воспользоваться свойством, которое часто ставит в тупик )

def UniqueVariables( self, locations ):
def flttr(a, n=set()):
if a['NAME'] not in n:
n.add(a['NAME'])
return True
return False

return filter(flttr, locations)

Отредактировано (Дек. 22, 2011 19:16:14)

Офлайн

#5 Дек. 22, 2011 19:39:00

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Список элементов словарей без повторения значения ключа

Goliath
return list( { k : k for k in locations }.values() )
                                     ^
SyntaxError: invalid syntax
>>> list( { k[ 'NAME' ] : k for k in locations }.values() )
[{'NAME': '__Q1', 'SIZE': 'Y'}, {'NAME': '__Q3', 'SIZE': 'I'}, {'NAME': '__Q2', 'SIZE': 'X'}]
>>>
>>> list( { k[ 'NAME' ] : k for k in reversed(locations) }.values() )
[{'NAME': '__Q1', 'SIZE': 'X'}, {'NAME': '__Q3', 'SIZE': 'X'}, {'NAME': '__Q2', 'SIZE': 'X'}]
>>>



Отредактировано (Дек. 22, 2011 19:46:56)

Офлайн

#6 Дек. 22, 2011 20:42:38

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Список элементов словарей без повторения значения ключа

return list( { k : k for k in locations }.values() )
^
SyntaxError: invalid syntax
это для 2x не будет работать

В этом случае например так:

from itertools import groupby

def UniqueVariables( self, a):
f=lambda x:x['NAME']
return [i[1].next() for i in groupby(sorted(a,key=f),f)]
непонятно зачем self



Офлайн

#7 Дек. 23, 2011 00:05:57

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Список элементов словарей без повторения значения ключа

doza_and
return list( { k : k for k in locations }.values() )
                                     ^
SyntaxError: invalid syntax
это для 2x не будет работать
А как же тогда во 2-м питоне создавать словари? Только через __setitem__ ?
p.s. чисто академический интерес, так как я 2й питон никогда не использовал и никогда не буду использовать

Еще вариант, где для 2го должен работать:
def UniqueVariables( locations ):
s = { k[ 'NAME' ] for k in locations }
return [k for k in locations if k['NAME'] in s and not s.remove(k['NAME'])]
Если вдруг и множества так нельзя создавать, тогда первую строку функции надо переписать так:
    s = set( [ k[ 'NAME' ] for k in locations ] )



Отредактировано (Дек. 23, 2011 00:34:28)

Офлайн

#8 Дек. 23, 2011 00:27:53

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

Список элементов словарей без повторения значения ключа

>>> def filt(k, *dicts):
... uni = []
... s = set()
... for d in dicts:
... v = d[k]
... if v not in s:
... s.add(v)
... uni.append(d)
... return uni
...
>>> dlst = [{ 'NAME': '__Q1', 'SIZE': 'X'},
... { 'NAME': '__Q3', 'SIZE': 'X'},
... { 'NAME': '__Q2', 'SIZE': 'X'},
... { 'NAME': '__Q1', 'SIZE': 'Y'},
... { 'NAME': '__Q3', 'SIZE': 'I'}]
>>>
>>> filt('NAME', *dlst)
[{'NAME': '__Q1', 'SIZE': 'X'}, {'NAME': '__Q3', 'SIZE': 'X'}, {'NAME': '__Q2', 'SIZE': 'X'}]
>>> filt('SIZE', *dlst)
[{'NAME': '__Q1', 'SIZE': 'X'}, {'NAME': '__Q1', 'SIZE': 'Y'}, {'NAME': '__Q3', 'SIZE': 'I'}]
>>>



Офлайн

#9 Дек. 23, 2011 00:39:29

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

Список элементов словарей без повторения значения ключа

Isem
А как же тогда во 2-м питоне создавать словари?
[guest@localhost ~]$ python2.7
Python 2.7 (r27:82500, Sep 16 2010, 18:03:06)
[GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> {i: None for i in range(10)}
{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}
>>>
 
[guest@localhost ~]$ python2.6
Python 2.6 (r26:66714, Nov 14 2011, 09:59:04)
[GCC 4.5.1 20100924 (Red Hat 4.5.1-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> {i: None for i in range(10)}
File "<stdin>", line 1
{i: None for i in range(10)}
^
SyntaxError: invalid syntax
>>> {i for i in range(10)}
File "<stdin>", line 1
{i for i in range(10)}
^
SyntaxError: invalid syntax
>>>
>>> dict((k, None) for k in range(10))
{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}
>>>



Отредактировано (Дек. 23, 2011 00:44:29)

Офлайн

#10 Дек. 23, 2011 00:41:46

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Список элементов словарей без повторения значения ключа

py.user.next
Python 2.6 (r26:66714, Nov 14 2011, 09:59:04)
on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> {i: None for i in range(10)}
File “<stdin>”, line 1
{i: None for i in range(10)}
^
SyntaxError: invalid syntax
Не завидую любителям посидеть за 2.6



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version