Вычислите различие в ключах, содержавшихся в двух словарях Python

Это - странный способ сделать это, но если Вы форматируете дату к yyyymmdd и вычитаете дату рождения из текущей даты, тогда отбрасывают последние 4 цифры, у Вас есть возраст:)

я не знаю C#, но я полагаю, что это будет работать на любом языке.

20080814 - 19800703 = 280111 

Отбрасывание последние 4 цифры = 28.

Код C#:

int now = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
int dob = int.Parse(dateOfBirth.ToString("yyyyMMdd"));
int age = (now - dob) / 10000;

Или альтернативно без всего преобразования типов в форме дополнительного метода. Проверка ошибок опустила:

public static Int32 GetAge(this DateTime dateOfBirth)
{
    var today = DateTime.Today;

    var a = (today.Year * 100 + today.Month) * 100 + today.Day;
    var b = (dateOfBirth.Year * 100 + dateOfBirth.Month) * 100 + dateOfBirth.Day;

    return (a - b) / 10000;
}
166
задан Nathan Davis 27 August 2015 в 20:07
поделиться

5 ответов

Вы можете использовать операции set с ключами:

diff = set(dictb.keys()) - set(dicta.keys())

Вот класс, чтобы найти все возможности: что было добавлено, что было удалено, какие пары ключ-значение совпадают и какие пары "ключ-значение" изменяются.

class DictDiffer(object):
    """
    Calculate the difference between two dictionaries as:
    (1) items added
    (2) items removed
    (3) keys same in both but changed values
    (4) keys same in both and unchanged values
    """
    def __init__(self, current_dict, past_dict):
        self.current_dict, self.past_dict = current_dict, past_dict
        self.set_current, self.set_past = set(current_dict.keys()), set(past_dict.keys())
        self.intersect = self.set_current.intersection(self.set_past)
    def added(self):
        return self.set_current - self.intersect 
    def removed(self):
        return self.set_past - self.intersect 
    def changed(self):
        return set(o for o in self.intersect if self.past_dict[o] != self.current_dict[o])
    def unchanged(self):
        return set(o for o in self.intersect if self.past_dict[o] == self.current_dict[o])

Вот пример вывода:

>>> a = {'a': 1, 'b': 1, 'c': 0}
>>> b = {'a': 1, 'b': 2, 'd': 0}
>>> d = DictDiffer(b, a)
>>> print "Added:", d.added()
Added: set(['d'])
>>> print "Removed:", d.removed()
Removed: set(['c'])
>>> print "Changed:", d.changed()
Changed: set(['b'])
>>> print "Unchanged:", d.unchanged()
Unchanged: set(['a'])

Доступен как репозиторий на github: https://github.com/hughdbrown/dictdiffer

233
ответ дан 23 November 2019 в 21:03
поделиться

Вот способ, который будет работать, позволяет использовать ключи, которые оцениваются как False , и по-прежнему использует выражение генератора для раннего отключения, если это возможно. Однако это не особо красиво.

any(map(lambda x: True, (k for k in b if k not in a)))

EDIT:

THC4k отправил ответ на мой комментарий к другому ответу. Вот способ получше и красивее:

any(True for k in b if k not in a)

Не знаю, как это никогда не приходило мне в голову ...

3
ответ дан 23 November 2019 в 21:03
поделиться

Если вы действительно имеете в виду именно то, что говорите (что вам нужно только выяснить, ЕСЛИ «есть какие-то ключи» в B, а не в A, а не КАКИЕ-ТО они могут быть, если они есть), Самый быстрый способ должен быть таким:

if any(True for k in dictB if k not in dictA): ...

Если вам действительно нужно выяснить, КАКИЕ КЛЮЧИ, если они есть, находятся в B, а не в A, а не только «ЕСЛИ» есть такие ключи, то существующие ответы вполне подходят (но я предлагаю более точный ответ в будущих вопросах, если вы действительно это имеете в виду; -).

13
ответ дан 23 November 2019 в 21:03
поделиться

Как написал Алекс Мартелли, если вы просто хотите проверить, не находится ли какой-либо ключ в B в A, any (Верно для k в dictB, если k не в dictA) было бы правильным решением.

Чтобы найти ключи, которые отсутствуют:

diff = set(dictB)-set(dictA) #sets

C:\Dokumente und Einstellungen\thc>python -m timeit -s "dictA =    
dict(zip(range(1000),range
(1000))); dictB = dict(zip(range(0,2000,2),range(1000)))" "diff=set(dictB)-set(dictA)"
10000 loops, best of 3: 107 usec per loop

diff = [ k for k in dictB if k not in dictA ] #lc

C:\Dokumente und Einstellungen\thc>python -m timeit -s "dictA = 
dict(zip(range(1000),range
(1000))); dictB = dict(zip(range(0,2000,2),range(1000)))" "diff=[ k for k in dictB if
k not in dictA ]"
10000 loops, best of 3: 95.9 usec per loop

Итак, эти два решения имеют примерно одинаковую скорость .

15
ответ дан 23 November 2019 в 21:03
поделиться

не уверен, "быстро" это или нет, но обычно это можно сделать

dicta = {"a":1,"b":2,"c":3,"d":4}
dictb = {"a":1,"d":2}
for key in dicta.keys():
    if not key in dictb:
        print key
18
ответ дан 23 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

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