在python中设置字典值不会更新该值吗?

时间:2018-07-18 11:08:25

标签: python dictionary

我试图简单地从两个字符串中替换缺失的日期值,但是将它们分成“ 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中的工作方式,我缺少什么吗?我很新。我也尝试了不同形式的字典更新命令。

在Anaconda中使用Python 3.6。

4 个答案:

答案 0 :(得分:1)

您可以更改函数的返回值。由于您不将其存储在任何地方,因此丢失了。相反,要做类似的事情

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

答案 1 :(得分:1)

每次调用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)

答案 2 :(得分:1)

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)

您不能保存对函数调用的更改,必须将其存储在变量中。

答案 3 :(得分:1)

正如其他人所说,您需要保存<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css" rel="stylesheet"/> <ul> <li> <span class="fa fa-ellipsis-v"></span> <span class="fa fa-eye"></span> <span class="title">Item 1</span> <span class="fa fa-sort-down"></span> <span class="fa fa-times"></span> </li> <li> <span class="fa fa-ellipsis-v"></span> <span class="fa fa-eye"></span> <span class="title">Item with long title</span> <span class="fa fa-sort-down"></span> <span class="fa fa-times"></span> </li> </ul>返回的字典,以便可以对其进行修改。但是,您的date_split函数比需要的要大得多,因此我使用zip编写了一个更紧凑的版本。

您的date_split函数在早期版本的python上总是无法正常工作,因为dict是无序集合,但是在Python 3.6+上也可以,因为dict现在保留了插入顺序。另外,也无需在recompile中调用strnew = str(date_split(std)['y'])返回的字典中的所有值已经是字符串。

date_split

输出

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)