Python 函数 - 遍历字典并更新值

时间:2021-05-27 12:03:46

标签: python python-3.x function loops dictionary

我遇到了一个问题,我试图遍历字典以根据用户的特定输入更新所有值。

我已经在下面发布了我的代码,基本上,用户在不同车道播放的输入框中输入一个数字,该函数应该更新字典以包含用户输入的值。

循环似乎没有遍历我字典中的每个键,只返回第一个值,然后似乎跳过了其余部分。

我只学习了 3 周的 Python 教程,我不确定我在这里做错了什么。

请看下面的代码:

def lane_input():

lanes_played = {"Top":0, "Middle":0, "Jungle":0, "Support":0, "ADC":0}

top_played = input("insert the number of times top played")
top_played = int(top_played) 

mid_played = input("insert the number of times Middle played")
mid_played = int(mid_played)

Jungle_played = input("insert the number of times Jungle played")
Jungle_played = int(Jungle_played)

Support_played = input("insert the number of times Support played")
Support_played = int(Support_played)

ADC_played = input("insert the number of times ADC played")
ADC_played = int(ADC_played)

for p, n in lanes_played.items():
    if p == 'Top': 
        lanes_played[p] = top_played
        
    if p == 'Middle': 
        lanes_played[p] = mid_played
    
    if p == 'Jungle': 
        lanes_played[p] = Jungle_played
    
    if p == 'Support': 
        lanes_played[p] = Support_played
        
    if p == 'ADC': 
        lanes_played[p] = ADC_played
    
    return(lanes_played)
        
print(lanes_played)
print(lanes_played[p])
print(lanes_played[n])

enter code here`enter code here`total = lane_input()
enter code here`print(total)

代码输出如下:

insert the number of times top played1
insert the number of times Middle played2
insert the number of times Jungle played3
insert the number of times Support played4
insert the number of times ADC played5

{'Top': 1, 'Middle': 0, 'Jungle': 0, 'Support': 0, 'ADC': 0}

3 个答案:

答案 0 :(得分:2)

这是因为你的代码缩进不好。 return 关键字在 for 循环的第一次迭代中被命中,这会使您的函数停止。

这是有效的,因为 return 发生在整个 for 循环之后:

def lane_input():

        lanes_played = {"Top":0, "Middle":0, "Jungle":0, "Support":0, "ADC":0}

        top_played = input("insert the number of times top played")
        top_played = int(top_played) 

        mid_played = input("insert the number of times Middle played")
        mid_played = int(mid_played)

        Jungle_played = input("insert the number of times Jungle played")
        Jungle_played = int(Jungle_played)

        Support_played = input("insert the number of times Support played")
        Support_played = int(Support_played)

        ADC_played = input("insert the number of times ADC played")
        ADC_played = int(ADC_played)

        for p, n in lanes_played.items():
                if p == 'Top': 
                        lanes_played[p] = top_played
                        
                if p == 'Middle': 
                        lanes_played[p] = mid_played
                
                if p == 'Jungle': 
                        lanes_played[p] = Jungle_played
                
                if p == 'Support': 
                        lanes_played[p] = Support_played
                        
                if p == 'ADC': 
                        lanes_played[p] = ADC_played
        
        return(lanes_played)

答案 1 :(得分:1)

return 位于 for-loop 内部,因此迭代仅在第一轮后停止。这就是你想要做的:

def lane_input():
    lanes_played = {"Top":0, "Middle":0, "Jungle":0, "Support":0, "ADC":0}

    top_played = input("insert the number of times top played")
    top_played = int(top_played) 

    mid_played = input("insert the number of times Middle played")
    mid_played = int(mid_played)

    Jungle_played = input("insert the number of times Jungle played")
    Jungle_played = int(Jungle_played)

    Support_played = input("insert the number of times Support played")
    Support_played = int(Support_played)

    ADC_played = input("insert the number of times ADC played")
    ADC_played = int(ADC_played)

    for p, n in lanes_played.items():
        if p == 'Top': 
            lanes_played[p] = top_played

        if p == 'Middle': 
            lanes_played[p] = mid_played

        if p == 'Jungle': 
            lanes_played[p] = Jungle_played

        if p == 'Support': 
            lanes_played[p] = Support_played

        if p == 'ADC': 
            lanes_played[p] = ADC_played
    
    return(lanes_played)
        
total = lane_input()
print(total)

输出

insert the number of times top played 1
insert the number of times Middle played 2
insert the number of times Jungle played 3
insert the number of times Support played 4
insert the number of times ADC played 5
{'Top': 1, 'Middle': 2, 'Jungle': 3, 'Support': 4, 'ADC': 5}

并且不需要遍历字典,因此您可以将代码重构为此(具有相同的输出)

def lane_input():
    lanes_played = {"Top":0, "Middle":0, "Jungle":0, "Support":0, "ADC":0}

    top_played = int(input("insert the number of times top played"))
    lanes_played['Top'] = top_played
    
    mid_played = int(input("insert the number of times Middle played"))
    lanes_played['Middle'] = mid_played
    
    Jungle_played = int(input("insert the number of times Jungle played"))
    lanes_played['Jungle'] = Jungle_played
    
    Support_played = int(input("insert the number of times Support played"))
    lanes_played['Support'] = Support_played
    
    ADC_played = int(input("insert the number of times ADC played"))
    lanes_played['ADC'] = ADC_played

    return(lanes_played)
        
total = lane_input()
print(total)

答案 2 :(得分:0)

您的问题已得到解答。这个答案只是为您的代码提供了一个更好的替代方案。

class SideMenuRouter: ObservableObject {
    
    @Published var current: SideMenuLink<AnyView, AnyView>?
    
    let routes: [SideMenuLink<AnyView, AnyView>]
    
    init(routes: [SideMenuLink<AnyView, AnyView>]) {
        self.routes = routes
        self.current = routes.first
    }
}

struct SideMenuLink<Label, Destination> : View where Label : View, Destination : View {

    let id: UUID = UUID()
    let destination: Destination
    let label: Label
    
    init(destination: Destination, @ViewBuilder label: () -> Label) {
        self.destination = destination
        self.label = label()
    }
    
    var body: some View {
        label
    }
}

extension SideMenuLink: Equatable {
    static func == (lhs: SideMenuLink<Label, Destination>, rhs: SideMenuLink<Label, Destination>) -> Bool {
        return lhs.id == rhs.id
    }
}