Интерполяция строк Python с использованием словаря и строк
Дано:
dict = {"path": "/var/blah"}
curr = "1.1"
prev = "1.0"
Какой лучший/самый короткий способ интерполяции строки для создания следующего:
путь:/var/blah curr: 1.1 prev: 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)
Мои извинения, если это похоже на чересчур педантичный вопрос.
Ответы
Ответ 1
Почему бы и нет:
mystr = "path: %s curr: %s prev: %s" % (mydict[path], curr, prev)
Кстати, я изменил пару имен, которые вы использовали, чтобы попирать встроенные имена - не делайте этого, он никогда не нужен и время от времени будет тратить много времени на отслеживание неправильного поведения, которое он вызывает ( где что-то использует встроенное имя, предполагая, что это означает встроенный, но вы скрыли его с именем нашей собственной переменной).
Ответ 2
Вы можете попробовать следующее:
data = {"path": "/var/blah",
"curr": "1.1",
"prev": "1.0"}
s = "path: %(path)s curr: %(curr)s prev: %(prev)s" % data
Ответ 3
И, конечно, вы можете использовать метод string (<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 и следует предпочесть% форматирование, описанное в Операции форматирования строк в новом коде.
Ответ 4
Может быть:
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'
Я просто не знаю, считаете ли вы, что короче.
Ответ 5
Вы также можете (скоро) использовать 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"]}')
Ответ 6
Вы можете сделать следующее, если вы поместите свои данные в словарь:
data = {"path": "/var/blah","curr": "1.1","prev": "1.0"}
"{0}: {path}, {1}: {curr}, {2}: {prev}".format(*data, **data)
Ответ 7
Обновление 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
Ответ 8
Если вы не хотите добавлять неизменяемые переменные в словарь каждый раз, вы можете ссылаться как на переменные, так и на словарные ключи, используя формат:
str = "path {path} curr: {curr} prev: {prev}".format(curr=curr, prev=prev, **dict)
Это может быть неправильная форма логически, но она делает вещи более модульными, ожидая, что curr и prev будут в основном статическими и словарь для обновления.