может ли словарь Python заменить только то, что он находит?

#python #dictionary

#питон #словарь #python

Вопрос:

Следующее работает нормально:

 line = "Hello %(firstname)s %(lastname)s, how are you?"
print line % dict (firstname = "Mike", lastname="Kane")
  

и печатает:

Привет, Майк Кейн, как дела?

Но если у меня нет значения для lastname , я все равно хочу, чтобы это сработало:

 line = "Hello %(firstname)s %(lastname)s, how are you?"
print line % dict (firstname = "Mike")
  

Я хочу, чтобы он просто игнорировал ключ lastname и печатал:

Привет, Майк , как дела?

Ответ №1:

Вы можете использовать defaultdict

 from collections import defaultdict

line = "Hello %(firstname)s %(lastname)s, how are you?"
print line % defaultdict(str, firstname = "Mike")
  

Объяснение: первый аргумент defaultdict инициализатора должен быть вызываемым, который возвращает значение по умолчанию. str вызываемый, который возвращает пустую строку (попробуйте str() ).

Комментарии:

1. Это не гибкий метод, потому что функция factory не принимает аргумент. Если вы используете __missing__ вместо этого, есть много вариантов того, что может быть возвращено.

2. @RaymondHettinger: верно, но этого нет в спецификациях OP.

Ответ №2:

Вы можете использовать make подкласс dictionary, который предоставляет значения по умолчанию для отсутствующих значений:

 >>> class Dict(dict):
        def __missing__(self, key):
            # supply a default value for a given key
            return key


>>> d = Dict(firstname = 'Mike')
>>> print "Hello %(firstname)s %(lastname)s, how are you?" % d
Hello Mike lastname, how are you?
  

Методы дают вам полный контроль над тем, что возвращается. Вот несколько вариантов:

 return '--missing--'       returns a default string
return key.upper()         highlight the missing key
return ''                  return an empty string
  

Ответ №3:

 class MyDict(dict):
    def __missing__(self, key):
        return ""
print("Hello %(firstname)s %(lastname)s, how are you?"
      % MyDict(firstname = "Mike"))
  

С принтами

 Hello Mike , how are you?