Найти - Пользователи
Полная версия: Список элементов словарей без повторения значения ключа
Начало » Python для новичков » Список элементов словарей без повторения значения ключа
1 2
Goliath
Я создал функцию
 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’}
Всё нормально работает
Как оптимизровать мою функцию? выглядит как-то не очень, на мой взгляд
Isem
def UniqueVariables( self, locations ):
return list({k['NAME']:k for k in reversed(locations)}.values())
Goliath
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
s0rg
А мне кажется, что тут стоит воспользоваться свойством, которое часто ставит в тупик )
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)
Isem
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'}]
>>>
doza_and
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
Isem
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 ] )
py.user.next
>>> 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'}]
>>>
py.user.next
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}
>>>
Isem
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB