簡體   English   中英

在python中設置字典值不會更新該值嗎?

[英]Setting dictionary value in python does not update the value?

我試圖從兩個字符串中替換掉缺失的日期值,但是將它們分成“ year”,“ month”等字典。但是我遇到了一個很奇怪的問題,在谷歌搜索20分鍾后我找不到答案。

這是我的代碼:

def date_split(date):
    parts = date.split('-')
    if len(parts) == 1:
        year = parts[0]
        dates = {'y' : year}
    if len(parts) == 2:
        year = parts[0]
        month = parts[1]
        dates = {'y' : year, 'm' : month}
    if len(parts) == 3:
        year = parts[0]
        month = parts[1]
        day = parts[2]
        dates = {'y' : year, 'm' : month, 'd' : day}
    return dates

def recompile(date):
    lista = list(date.values())
    date = "-".join(lista)
    return date

std = "2018-07-18"
x = "XXXX-01"

if date_split(x)['y'] == 'XXXX':
    new = str(date_split(std)['y'])
    date_split(x)['y'] = new
    date = recompile(date_split(x))
    print(date)

我剛剛開始花哨的時間,所以它很粗糙,但是我正在研究它。 然而,雖然date_split(std)['y']打印出作為2018 ,后date_split(x)['y'] = new ,的值date_split(x)['y']打印出作為"XXXX"靜止。 因此,字典不會更新該值。 關於字典在python中的工作方式,我缺少什么嗎? 我很新。 我也嘗試了字典更新命令的不同形式。

將Python 3.6與Anaconda結合使用。

您更改函數的返回值。 由於您不將其存儲在任何地方,因此丟失了。 而是做類似的事情

 custom_date = date_split(x)
 custom_date['y'] = new
 date = recompile(custom_date)

每次調用date_split(x)它都會返回一個新的字典,因此對其進行更新不會對下一個調用產生影響。 相反,您應該將date_split(x)的返回值分配給變量,然后使用該變量進行進一步處理。

std = "2018-07-18"
x = "XXXX-01"
s = date_split(x)
if s['y'] == 'XXXX':
    new = str(date_split(std)['y'])
    s['y'] = new
    date = recompile(s)
    print(date)
def date_split(date):
    parts = date.split('-')
    if len(parts) == 1:
        year = parts[0]
        dates = {'y' : year}
    if len(parts) == 2:
        year = parts[0]
        month = parts[1]
        dates = {'y' : year, 'm' : month}
    if len(parts) == 3:
        year = parts[0]
        month = parts[1]
        day = parts[2]
        dates = {'y' : year, 'm' : month, 'd' : day}
    return dates

def recompile(date):
    lista = list(date.values())
    date = "-".join(lista)
    return date

std = "2018-07-18"
x = "XXXX-01"

if date_split(x)['y'] == 'XXXX':
    old = date_split(x)
    new = str(date_split(std)['y'])
    print(old)
    print(new)
    old['y'] = new
    date = recompile(old)
    print(date)

您不能在函數調用中保存更改,而必須將其存儲在變量中。

正如其他人所說,您需要保存date_split返回的字典,以便對其進行修改。 但是,您的date_split函數比需要的要大得多,因此我使用zip編寫了一個更緊湊的版本。

您的recompile函數將無法始終在早期版本的python上正常運行,因為dict是無序集合,但是在Python 3.6+上是可以的,因為dict現在保留了插入順序。 另外,也不需要在new = str(date_split(std)['y'])調用str date_split返回的dict中的所有值已經是字符串。

def date_split(date):
    return dict(zip("ymd", date.split("-")))

def recompile(date):
    return "-".join(date.values())

std = "2018-07-18"
x = "XXXX-01"

x_split = date_split(x)
print("Original", x_split)
if x_split["y"] == "XXXX":
    x_split["y"] = date_split(std)["y"]
    print("Updated ", x_split)
    date = recompile(x_split)
    print("String  ", date)

產量

Original {'y': 'XXXX', 'm': '01'}
Updated  {'y': '2018', 'm': '01'}
String   2018-01

暫無
暫無

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

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