Как сравнить два JSON по элементам, а не значениям с помощью python [duplicate]

Вот еще одно решение без BigDecimals

Truncate:

(math floor 1.23456789 * 100) / 100

Round:

(math rint 1.23456789 * 100) / 100

Или для любого двойного n и точности p:

def truncateAt(n: Double, p: Int): Double = { val s = math pow (10, p); (math floor n * s) / s }

Аналогично может быть сделано для функции округления, на этот раз с использованием currying:

def roundAt(p: Int)(n: Double): Double = { val s = math pow (10, p); (math round n * s) / s }

, который более многоразовый, например при округлении денежных сумм можно использовать следующее:

def roundAt2(p: Int) = roundAt(2)(p)
15
задан SilentGhost 9 July 2010 в 09:13
поделиться

6 ответов

Вы можете получить ключи для словаря с помощью dict.keys ().

Вы можете включить это в набор с помощью set (dict.keys ())

Вы можете сравните множества с ==

Подводя итог:

set(d_1.keys()) == set(d_2.keys())

даст вам то, что вы хотите.

19
ответ дан xorsyst 18 August 2018 в 19:37
поделиться
  • 1
    вам не нужно keys. – SilentGhost 9 July 2010 в 09:09
  • 2
    Даже проще, чем это, поскольку set (dict) дает только ключи ... – Andrew Jaffe 9 July 2010 в 09:10
  • 3
    Правда, вам не нужны ключи, но если вы не используете наборы очень часто, я бы сказал, что поведение набора (словаря) неочевидно. Кто-нибудь знает, влияет ли использование ключей на производительность? – xorsyst 9 July 2010 в 14:06
  • 4
    @xorsyst: в Python 2 iter(a_dict) возвращает итератор, a_dict.keys() возвращает список; поэтому set(d_1.keys()) берет на себя создание и уничтожение временного списка ключей словаря. В Python 3 они эквивалентны. – tzot 11 July 2010 в 10:24
  • 5
    @Joschua: Если вы знакомы со списком (some_dict), то я согласен, что set (some_dict) должен быть довольно очевиден. Но для меня совершенно очевидно, что они будут работать так, как они. Мое первое ожидание состоит в том, что список (some_dict) будет списком кортежей (ключ, значение). Я согласен, что возвращение только ключей - это полезное поведение, но я бы не сказал, что это «очевидно». – xorsyst 7 March 2011 в 10:25

Быстрый вариант (не уверен, что его наиболее оптимальный)

len(set(d_1.keys()).difference(d_2.keys())) == 0
-1
ответ дан Alex 18 August 2018 в 19:37
поделиться
  • 1
    Ответ SilentGhost вернет false, если ключи одинаковы, но значения разные – Alex 9 July 2010 в 09:07
  • 2
    Проверка на len == 0, вероятно, самая безобидная вещь. – SilentGhost 9 July 2010 в 09:10
  • 3
    @Alex Nope. Попробуй сам. – augurar 5 February 2017 в 12:03
  • В Python 3, dict.keys() возвращает объект просмотра ", который может использоваться как набор. Это намного эффективнее, чем создание отдельного набора.
    d_1.keys() == d_2.keys()
    
  • В Python 2.7, dict.viewkeys() делает то же самое.
    d_1.viewkeys() == d_2.viewkeys()
    
  • В Python 2.6 и ниже вам нужно построить набор ключей каждого dict.
    set(d_1) == set(d_2)
    
    Или вы можете перебирать ключи самостоятельно для большей эффективности памяти.
    len(d_1) == len(d_2) and all(k in d_2 for k in d_1)
    
2
ответ дан augurar 18 August 2018 в 19:37
поделиться

В Python2,

set(d_1) == set(d_2)

В Python3 вы можете сделать это, что может быть немного более эффективным, чем создание множеств

d1.keys() == d2.keys()

, хотя способ Python2 будет работать тоже

26
ответ дан John La Rooy 18 August 2018 в 19:37
поделиться

Один из способов - проверить симметричную разницу (новый набор с элементами в s или t, но не для обоих):

set(d_1.keys()).symmetric_difference(set(d_2.keys()))

Но более короткий путь к простому сравните множества:

set(d_1) == set(d_2)
0
ответ дан miku 18 August 2018 в 19:37
поделиться
>>> not set(d_1).symmetric_difference(d_2)
False
>>> not set(d_1).symmetric_difference(dict.fromkeys(d_1))
True
0
ответ дан SilentGhost 18 August 2018 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: