Это - странный способ сделать это, но если Вы форматируете дату к 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;
}
Вы можете использовать операции 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
Вот способ, который будет работать, позволяет использовать ключи, которые оцениваются как 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)
Не знаю, как это никогда не приходило мне в голову ...
Если вы действительно имеете в виду именно то, что говорите (что вам нужно только выяснить, ЕСЛИ «есть какие-то ключи» в B, а не в A, а не КАКИЕ-ТО они могут быть, если они есть), Самый быстрый способ должен быть таким:
if any(True for k in dictB if k not in dictA): ...
Если вам действительно нужно выяснить, КАКИЕ КЛЮЧИ, если они есть, находятся в B, а не в A, а не только «ЕСЛИ» есть такие ключи, то существующие ответы вполне подходят (но я предлагаю более точный ответ в будущих вопросах, если вы действительно это имеете в виду; -).
Как написал Алекс Мартелли, если вы просто хотите проверить, не находится ли какой-либо ключ в 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
Итак, эти два решения имеют примерно одинаковую скорость .
не уверен, "быстро" это или нет, но обычно это можно сделать
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