dictionary

SA
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:61
0

czesc, w swojej klasie mam liste ktorej elementami sa dictionaries, ma ktos jakis pomysl na funkcje ktora bedzie zwracac ta liste ale bez jednego z pol ze slownikow ( czyli np 4 z 5 pol w kazym slowniku), moze jakos dekoratorami, ale nic nie przychodzi mi do glowy ?

PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
  • Postów:426
1

Chcesz osiągnąć efekt w stylu:

Kopiuj
some_list = [{"a": 1, "b": 2, "c": 3}, {"a": 3, "b": 4, "c": 5}]
new_list = [{k: v for k,v in some_dict.items() if k != "c"} for some_dict in some_list]

?

edytowany 1x, ostatnio: part
Pyxis
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 2 godziny
2
Kopiuj
def reduce_dicts(dict_lst):
    for d in dict_lst:
        d.popitem()

lst = [{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}, {'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 10}]
reduce_dicts(lst)  # lst = [{'a': 1, 'b': 2, 'c': 3, 'd': 4}, {'f': 6, 'g': 7, 'h': 8, 'i': 9}]
PA
ale z tego co zrozumiałem, funkcja miała zwrócić nową listę - bez modyfikowania starej.
Pyxis
Ja właśnie zrozumiałem, że należy zmodyfikować pierwotną listę. No cóż, może autor doprecyzuje :)
SA
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:61
0

nowa lista dla wgladu do uzytkownika bez tego jednego elementu, sorry za niejasnosc, dzieki wielkie !

Pyxis
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 2 godziny
1

To co zaakceptowałeś jako najlepszą odpowiedź nie do końca jest dobre, bo zakłada, że w każdym słowniku istnieje przynajmniej jeden wspólny klucz (w przykładzie jest to "c"). Lepiej już zrobić tak:

Kopiuj
from copy import deepcopy

def reduce_dicts(dict_lst):
    dict_lst = deepcopy(dict_lst)
    for d in dict_lst:
        d.popitem()

    return dict_lst

reduce_dicts(lst)  # [{'a': 1, 'b': 2, 'c': 3, 'd': 4}, {'f': 6, 'g': 7, 'h': 8, 'i': 9}]

Przy czym też jest ciche założenie, że lst nie zawiera pustego słownika. W przeciwnym wypadku zostanie rzucony KeyError.

edytowany 1x, ostatnio: Pyxis
PA
nie zakłada, jak nie będzie "c", to po prostu nie wywali tej kolumny. Myślę, że op chce wywalić konkretne klucze ze słowników
Pyxis
Jeśli tak, to Twoje rozwiązanie jest jak najbardziej poprawne. Natomiast ja znów inaczej interpretuję słowa czyli np 4 z 5 pol w kazym slowniku. Ileż to znaczy poprawne zdefiniowanie problemu, nie? :)
PA
Dlatego analitycy biznesowi zarabiają więcej ode mnie.
SA
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:61
0

mysle jeszcze jak zgrabnie dostac sie do zagniezdzonego slownika zeby z niego wyrzucic jeden element

Kopiuj
some_list = [{"a": 1, "b": {'one': 1, 'two': 2}, "c": 3}, {"a": 3, "b": {'one': 3, 'two': 4}, "c": 5}]

np dla "b" tylko pole 'one'

edytowany 1x, ostatnio: sabek
PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
  • Postów:426
1
Kopiuj
def remove_keys(nested_dict: dict, path: str):
  def aux(acc, a):
    for k, v in acc.items():
      current = a + (k, )
      if current != path:
        if isinstance(v, dict):
          yield k, dict(aux(v, current))
        else:
          yield k, v
    

  return dict(aux(nested_dict, ()))      

some_list = [{"a": 1, "b": {'one': 1, 'two': 2}, "c": 3}, {"a": 3, "b": {'one': 3, 'two': 4}, "c": 5}]

if __name__ == "__main__":
  new_list = []
  for d in some_list:
    new_list.append(remove_keys(d, ("b", "one")))
  print(new_list)

https://rextester.com/FGM4488

PA
haskell odbiera mi chyba umiejętności pisania w pythonie :(
SA
super ;)
Pyxis
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 2 godziny
1

Pomijając robienie kopii listy some_list można z tej listy usunąć pole 'one' w słowniku 'b' korzystając z rekurencji:

Kopiuj
def remove(d, keys):
    d.pop(keys[0]) if len(keys) == 1 else remove(d.get(keys[0]), keys[1:])

some_list = [{'a': 1, 'b': {'one': 1, 'two': 2}, 'c': 3}, {'a': 3, 'b': {'one': 3, 'two': 4}, 'c': 5}]

[remove(d, ('b', 'one')) for d in some_list]
print(some_list)  # [{'a': 1, 'b': {'two': 2}, 'c': 3}, {'a': 3, 'b': {'two': 4}, 'c': 5}]

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.