簡體   English   中英

使用 f 字符串的列表理解

[英]List comprehension using f-strings

我有三個變量

a = 1
b = 2
c = 3

我想要一個像'a=1, b=2, c=3'這樣的字符串

所以,我使用 f-string,

x = ''
for i in [a, b, c]:
   x += f"{i=}"

但它給了,

x
'i=1, i=2, i=3, '

如何使i成為abc

列表[a, b, c]與列表[1, 2, 3]沒有區別——變量本身沒有放在列表中,它們的值是,所以沒有辦法從列表中獲取變量名創建后列出。

如果您想要字符串abc ,則需要遍歷這些字符串,而不是評估這些變量的結果:

>>> ', '.join(f"i={i}" for i in "abc")
'i=a, i=b, i=c'

如果你想獲得具有這些名稱的變量所持有的值,你可以通過在globals()字典中查找它們來實現:

>>> a, b, c = 1, 2, 3
>>> ', '.join(f"{var}={globals()[var]}" for var in "abc")
'a=1, b=2, c=3'

但是涉及在globals()中查找內容的代碼在第一次出現問題時調試起來真的很煩人。 任何時候你有一組要迭代的命名值時,最好將這些值放在它們自己的字典中而不是使它們成為單獨的變量:

>>> d = dict(a=1, b=2, c=3)
>>> ', '.join(f"{var}={val}" for var, val in d.items())
'a=1, b=2, c=3'

列表不記得分配給它的變量的名稱。 為此,您需要一本字典。

x = ""
my_dict = {'a': a, 'b': b, 'c': c}
for k, v in my_dict.items():
    x += f"{k}={v}, "

使用 gloabls 並不總是一個好主意,如果你想要一個避免使用它們的解決方案,你可以檢查使用 inspect 模塊聲明的變量, 這里有關於獲取變量名稱的線程,我從 function 中獲取。

import inspect

def retrieve_var(var):
    callers_local_vars = inspect.currentframe().f_back.f_locals.items()
    return [var_name for var_name, var_val in callers_local_vars if var_val is var]

現在您可以使用類似於您使用的循環

a, b, c = 1, 2, 3

x = ''

for i in [a, b, c]:
    var = retrieve_var(i)
    x += f"{var[0]}={i}, "

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM