Подтвердить что ты не робот

Интерполяция строк 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)

Мои извинения, если это похоже на чересчур педантичный вопрос.

4b9b3361

Ответ 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 будут в основном статическими и словарь для обновления.