Python如何从嵌套循环返回嵌套字典? [重复]

问题描述 投票:0回答:1

我对 Python 和一般编程都很陌生,所以请耐心等待我和我的代码:)

我试图为我的一些机器收集一些基于轮班的日期,并遇到了正确构建我的返回字典的问题。

当我单步执行该函数时,我可以看到每个班次都正确读取数据,并且“maschinen_liste”字典以及生成的“day”字典都是正确的,但是一旦我到达第二天,前一天内的数据日期条目更改为添加的当前数据,依此类推。 现在我的问题是,字典中的条目如何能够像这样向后改变? 或者我只是根本不明白字典和嵌套循环是如何工作的?

我已经将代码简化到了这一点,但我仍然没有看到任何错误,而且我无法弄清楚这里出了什么问题。

import random

NrByMonth = {
                "Januar": "01" ,
                "Februar": "02"
            }


def Readshiftdata(year_input="2020"):
    # dict structured like  dataframe = {"Jahr":{"Monat":{"Tag":{"Presse":{"Schicht":{"elektrisch":{"Verbrauch1":"","VerbrauchN":""},"informationen":{"Datum":"","Schichtführer":"","Nutzungsgrad":""},"produktionsdaten":{"Artikel1":{"Charge":"","Gutteile":"","Ausschuss1":"","Ausschuss2":"","Ausschuss3":"","Werker":"","Qualitaetspruefer":""},"Artikel2":{"Charge":"","Gutteile":"","Ausschuss1":"","Ausschuss2":"","Ausschuss3":"","Werker":"","Qualitaetspruefer":""},"Artikel3":{"Charge":"","Gutteile":"","Ausschuss1":"","Ausschuss2":"","Ausschuss3":"","Werker":"","Qualitaetspruefer":""},"Artikel4":{"Charge":"","Gutteile":"","Ausschuss1":"","Ausschuss2":"","Ausschuss3":"","Werker":"","Qualitaetspruefer":""}}}}}}}}
    return_data = {}
    month = {}
    year = year_input
    maschinen_liste = {"Pr5":{}}

    
    
    # iterating over every month
    for this_month in NrByMonth:

        day = {}
        # iterating over every day per month
        dayspermonth = 2
        this_day = 1
        for this_day in range(1,dayspermonth+1):   
            temp_day = this_day

            # reading per maschine
            for maschine in maschinen_liste:
            
                # reading shift per maschine
                shifts = {"Frühschicht":{},"Spätschicht":{},"Nachtschicht":{}}
                for shift in shifts:

                    this_shift = {"E-Daten":{},"Informationen":{},"Produktionsdaten":{}}
                    # fetching artikel data
                    artikel = {"Artikel 1":{}}

                    for a in artikel:

                        dataframe = {}
                        Charge = random.randint(1,100)
                        Gutteile = random.randint(1,100)
                        dataframe = {"Charge":Charge,"Gutteile":Gutteile}

                        artikel[a] = dataframe

                    shifts[shift]["Produktionsdaten"] = artikel

                maschinen_liste[maschine] = shifts
                print(maschinen_liste)
        


            day[temp_day] = maschinen_liste
            print("temp day :")
            print(temp_day)
            print("day:")
            print(day)
            print("maschinen_liste :")
            print(maschinen_liste)
            input()

        month[this_month] = day
        print("month:\n\n\n")
        print(month)


    return_data[year] = month

    return(return_data)

year = Readshiftdata()

print("year: \n\n\n")
print(year)

输出:

year = {'2020': {
    'Januar': {
        1: {
            'Pr5': {
                'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 41, 'Gutteile': 95}}}, 
                'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 54}}}, 
                'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 39}}}}}, 
                
        2: {
            'Pr5': {
                'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 41, 'Gutteile': 95}}}, 
                'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 54}}}, 
                'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 39}}}}}}, 
                
    'Februar': {
        1: {
            'Pr5': {
                'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 41, 'Gutteile': 95}}}, 
                'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 54}}}, 
                'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 39}}}}}, 
                
        2: {
            'Pr5': {
                'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 41, 'Gutteile': 95}}}, 
                'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 54}}}, 
                'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 37, 'Gutteile': 39}}}}}}}}

如果我将

day[temp_day] = maschinen_liste
更改为
day[temp_day] = str(maschinen_liste)+str(temp_day)
它正确保存日期...

输出:

year = {'2020': {
    'Januar': {
        1: "{
            'Pr5': {'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 77, 'Gutteile': 44}}}, 
            'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 100, 'Gutteile': 72}}}, 
            'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 93, 'Gutteile': 22}}}}}1", 
            
        2: "{
            'Pr5': {
                'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 27, 'Gutteile': 21}}}, 
                'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge':27, 'Gutteile': 29}}}, 
                'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 41, 'Gutteile': 72}}}}}2"}, 
                
    'Februar': {
        1: "{
            'Pr5': {
                'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 74, 'Gutteile': 27}}}, 
                'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 65, 'Gutteile': 83}}}, 
                'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 14, 'Gutteile': 11}}}}}1", 
                
        2: "{
            'Pr5': {'Frühschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 19, 'Gutteile': 16}}}, 
            'Spätschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 57, 'Gutteile': 17}}}, 
            'Nachtschicht': {'Produktionsdaten': {'Artikel 1': {'Charge': 56, 'Gutteile': 52}}}}}2"}}}

好的,它是一个字符串,每个字符串都会添加一个数字,但这表明数据显然在那里(我很困惑......)

python dictionary nested-loops
1个回答
3
投票

在代码中,您可以在所有循环之外的开头初始化

maschinen_liste = {"Pr5":{}}
。当您执行
day[temp_day] = maschinen_liste
时,不会创建新字典(它只是对同一字典的引用)。所以最后,你每天都会指向同一本字典。

如果您将

maschinen_liste = {"Pr5":{}}
放入每日循环中,在
for this_day in range(1,dayspermonth+1):
之后,应该可以解决问题,因为它将每天创建一个新字典。

© www.soinside.com 2019 - 2024. All rights reserved.