[英]Dictionary comprehension using *args and **kwargs
我是 Python 的新手。我必須做一些練習。 我有兩個類 RealNumber 和 ComplexNumber,我需要創建一個新的 class,作為一個屬性,一個包含 integer 作為鍵和 RealNumber 或 ComplexNumber object 作為值的字典 (dict_number)。 在init方法中,參數 *args 和 **kwargs,*args 中的每個 arg 必須使用遞增的 integer 鍵輸入(使用字典理解)(例如 {0: RealNumber0, 1: RealNumber1, 2: ComplexNumber0})而對於 kwargs 中的每個參數,都需要插入參數名稱:值。 現在,我已經創建了 RealNumber 和 ComplexNumber 類,但是我在執行第三個 class 時遇到了問題。如何創建一個以增量值作為鍵和一個元組(對象名稱,object 值)作為值的字典? 字典必須有這樣的形式: {incremental key: (name_object, object value)}
,例如: {0: Realnumber 5, 1: ComplexNumber 1+3i...}
其中0:
是增量鍵; Realnumber
是object class的名字; 5
是Realnumber
class object 包含的值。
...
class NumbersCollection: # I've issues here
def __init__(self, *args, **kwargs):
self.dict_numbers = {key: arg for key, arg in kwargs.items()}
if __name__ == '__main__':
x = RealNumber(5)
y = ComplexNumber(1, 3) #first parameter is the real part, the 2nd is the imaginary part
print(f"Number: {x.number}")
print(f"RealPart: {y.numPart}, ImPart: {y.imPart}")
d = NumbersCollection(a=x, b=y) # I've issues here
...
這個怎么樣?
class NumbersCollection:
def __init__(self, **kwargs):
self.dict_numbers = {
i: (key, value) for i, (key, value) in enumerate(kwargs.items())
}
>>> nums = NumbersCollection(a=1, b=2)
>>> nums.dict_numbers
{0: ('a', 1), 1: ('b', 2)}
老實說,你在一個問題中問了太多問題。 所以還有另一個答案。
__repr__
您可以修改 class 的 object 的representation
,在 class 上定義__repr__
方法:
class SomeClass:
def __init__(self, value: int) -> None:
self.value = value
def __repr__(self):
return f"SomeClass {self.value}"
>>> SomeClass(1)
SomeClass 1
enumerate
您可以在可迭代對象上使用enumerate
function 來迭代序列中的對象,返回index
作為第一個值,返回 object 的value
作為第二個值
data = {
"a": 1,
"b": 2,
"c": 3,
}
>>> for i, (key, value) in enumerate(data.items()):
... print(i, key, value)
...
0 a 1
1 b 2
2 c 3
結合這些技術以獲得所需的答案。
使用__repr__
:
class RealNumber:
def __init__(self, value: int) -> None:
self.value = value
def __repr__(self):
return f"RealNumber {self.value}"
class ComplexNumber:
def __init__(self, value: int, imaginary_part: int) -> None:
self.real_part = value
self.imaginary_part = imaginary_part
def __repr__(self):
return f"ComplexNumber {self.real_part}+{self.imaginary_part}i"
使用enumerate
:
class NumbersCollection:
def __init__(self, *args: Union[RealNumber, ComplexNumber]):
self.dict_numbers = dict(enumerate(args))
不需要使用字典理解,因為dict(enumerate(args))
做同樣的事情,但更好更清潔。 當然,如果這是您作業的要求,您可以使用它們。
class NumbersCollection:
def __init__(self, *args: Union[RealNumber, ComplexNumber]):
self.dict_numbers = {i: value for i, value in enumerate(args)}
兩者都應該產生相同的答案。
>>> nums = NumbersCollection(RealNumber(1), ComplexNumber(1, 2))
>>> nums.dict_numbers
{0: RealNumber 1, 1: ComplexNumber 1+2i}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.