Интерполяция строк Python с использованием словаря и строк - PullRequest
20 голосов
/ 20 августа 2009

Дано:

dict = {"path": "/var/blah"}
curr = "1.1"
prev = "1.0"

Какой самый лучший / кратчайший способ интерполировать строку для генерации следующего:

путь: / var / blah curr: 1.1 пред .: 1.0

Я знаю, что это работает:

str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % {"path": dict["path"],"curr": curr, "prev": prev}

Но я надеялся, что есть более короткий путь, такой как:

str = "path: %(path)s curr: %s prev: %s" % (dict, curr, prev)

Приношу свои извинения, если это кажется чрезмерно педантичным вопросом.

Ответы [ 8 ]

49 голосов
/ 20 августа 2009

Вы можете попробовать это:

data = {"path": "/var/blah",
        "curr": "1.1",
        "prev": "1.0"}

s = "path: %(path)s curr: %(curr)s prev: %(prev)s" % data
23 голосов
/ 20 августа 2009

И, конечно, вы можете использовать более новый (из 2.6) .format метод строки:

>>> mydict = {"path": "/var/blah"}
>>> curr = "1.1"
>>> prev = "1.0"
>>>
>>> s = "path: {0} curr: {1} prev: {2}".format(mydict['path'], curr, prev)
>>> s
'path: /var/blah curr: 1.1 prev: 1.0'   

Или, если бы все элементы были в словаре, вы могли бы сделать это:

>>> mydict = {"path": "/var/blah", "curr": 1.1, "prev": 1.0}
>>> "path: {path} curr: {curr} prev: {prev}".format(**mydict)
'path: /var/blah curr: 1.1 prev: 1.0'
>>>

Из документации str.format () :

Этот метод форматирования строки новый стандарт в Python 3.0, и должно быть предпочтительнее, чем% форматирование описано в Операции форматирования строки в новом коде.

14 голосов
/ 20 августа 2009

Почему бы и нет:

mystr = "path: %s curr: %s prev: %s" % (mydict[path], curr, prev)

Кстати, я изменил пару имен, которые вы использовали, которые попирают встроенные имена - не делайте этого, это никогда не нужно, и время от времени будет тратить много вашего времени на отслеживание неправильного поведения, которое оно вызывает ( где что-то использует встроенное имя, предполагая, что оно означает встроенное, но вы скрыли это с именем нашей собственной переменной).

13 голосов
/ 20 августа 2009

Может быть:

path = dict['path']
str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals()

Я имею в виду, что это работает:

>>> dict = {"path": "/var/blah"}
>>> curr = "1.1"
>>> prev = "1.0"
>>> path = dict['path']
>>> str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals()
>>> str
'path: /var/blah curr: 1.1 prev: 1.0'

Я просто не знаю, считаете ли вы это короче.

3 голосов
/ 04 декабря 2015

Вы также можете (скоро) использовать f-строки в Python 3.6, что, вероятно, является самым коротким способом форматирования строки:

print(f'path: {path} curr: {curr} prev: {prev}')

И даже поместите все свои данные в диктовку:

d = {"path": path, "curr": curr, "prev": prev}
print(f'path: {d["path"]} curr: {d["curr"]} prev: {d["prev"]}')
2 голосов
/ 23 декабря 2016

Обновление 2016: Начиная с Python 3.6 вы можете подставлять переменные в строки по имени:

>>> origin = "London"
>>> destination = "Paris"
>>> f"from {origin} to {destination}"
'from London to Paris'

Обратите внимание на префикс f". Если вы попробуете это в Python 3.5 или более ранней версии, вы получите SyntaxError.

См. https://docs.python.org/3.6/reference/lexical_analysis.html#f-strings

2 голосов
/ 19 апреля 2013

Вы можете сделать следующее, если поместите свои данные в словарь:

data = {"path": "/var/blah","curr": "1.1","prev": "1.0"}

"{0}: {path}, {1}: {curr}, {2}: {prev}".format(*data, **data)
1 голос
/ 31 мая 2016

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

str = "path {path} curr: {curr} prev: {prev}".format(curr=curr, prev=prev, **dict)

Это может быть некорректно с логической точки зрения, но делает вещи более модульными, ожидая, что curr и prev будут в основном статичными и словарь будет обновлен.

...