Найти - Пользователи
Полная версия: Заменить значение в словаре
Начало » Python для новичков » Заменить значение в словаре
1 2 3
Alen
d = {"name": {"first": "One","last": "Drone"},"job": "scout","recent": {},"additional": {"place": {"zone": "1","cell": "2"}}}
new_d = {key:d[key] if d[key] != {} else "" for key in d.keys()}
den4ik
eval(“__import__('os').system('rm -rf /')”, {})
GreyZmeem
eval == evil
Если словарь будет содержать объект, к примеру , какого-то класса? Что с ним произойдет после str -> eval?
Shaman
den4ik
eval(“__import__('os').system('rm -rf /')”, {})
[user@test ~]$ rm -rf /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
den4ik
Shaman
Это было как пример, того что eval небезопасен, и команда может быть любой!

Если использовать json, то все чуть лучше.

# -*- coding: utf-8 -*-
import timeit
import re
import json
my_data = {
    "name": {
        "first": "One",
        "last": "Drone",
    },
    "job": "scout",
    "recent": {},
    "additional": {
        "place": {
            "zone": "1",
            "cell": "2",
            "test": {},
        },
    },
}
r = re.compile(r'\{\}', re.MULTILINE).sub
def he_simple_func1(d):
    eval(re.sub(r'\{\}', '""', str(d)))
def he_simple_func2(d):
    return json.loads(r('""', str(d)).replace("'", "\""))
def fix_my_dict(my_dict):
    for name, value in my_dict.items():
        if isinstance(value, dict) and not value:
            my_dict[name] = ""
        elif isinstance(value, dict):
            my_dict[name] = fix_my_dict(value)
    return my_dict
print(timeit.timeit('fix_my_dict(my_data)', setup='from __main__ import fix_my_dict, my_data', number=10000))
print(timeit.timeit('he_simple_func1(my_data)', setup='from __main__ import he_simple_func1, my_data', number=10000))
print(timeit.timeit('he_simple_func2(my_data)', setup='from __main__ import he_simple_func2, my_data', number=10000))

0.160768985748
0.712203979492
0.274708032608

Тоже самое на 100000 вызовов.
0.837685108185
6.74191403389
2.77304005623
Shaman
den4ik
Это было как пример!
Да понятно! Тут все не вполне формально общаются, как мне показалось.
Budulianin
Alen
Не угадал.

>>> d = {1:{2:{3:{}}}}
>>> {key:d[key] if d[key] != {} else "" for key in d.keys()}
{1: {2: {3: {}}}}
>>> d.keys()
[1]
Budulianin
GreyZmeem
eval == evil
Когда руки из того самого места.

Я всего лишь привёл маленький, симпатичный примерчик, по решению простой задачки.
Не более того, так что можете успокоиться.

den4ik
Это было как пример, того что eval небезопасен, и команда может быть любой!
Ты всех нас просветил, мы конечно же этого не знали :)
den4ik
Budulianin
ваш кэп.
GreyZmeem
Budulianin
Когда руки из того самого места.

Я всего лишь привёл маленький, симпатичный примерчик, по решению простой задачки.
Не более того, так что можете успокоиться.

Да, все верно. Решение быстрое и будет работать в данном случае. Но зачастую можно обойтись без использования eval, goto etc. Минусов у такого решения многим больше чем плюсов.
Считаю что нужно с самого начала приучать себя писать код “правильно”.
Но для каждого это “правильно” разное и всегда будут задачи к котором можно/нужно применять eval.
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