dictionary

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 ?

1

Chcesz osiągnąć efekt w stylu:

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]

?

2
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}]
0

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

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:

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.

0

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

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'

1
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

1

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

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}]

1 użytkowników online, w tym zalogowanych: 0, gości: 1