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 ?

- Rejestracja:ponad 7 lat
- Ostatnio:około 2 godziny
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}]

- Rejestracja:ponad 8 lat
- Ostatnio:ponad 4 lata
- Postów:61
nowa lista dla wgladu do uzytkownika bez tego jednego elementu, sorry za niejasnosc, dzieki wielkie !

- Rejestracja:ponad 7 lat
- Ostatnio:około 2 godziny
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
.

czyli np 4 z 5 pol w kazym slowniku
. Ileż to znaczy poprawne zdefiniowanie problemu, nie? :)
- Rejestracja:ponad 8 lat
- Ostatnio:ponad 4 lata
- Postów:61
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'
- Rejestracja:ponad 6 lat
- Ostatnio:około 2 lata
- Postów:426
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)

- Rejestracja:ponad 7 lat
- Ostatnio:około 2 godziny
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}]
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.