Python字典:迭代dict的不同方式

2024-09-21 01:13:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种不同的方法来访问for循环中字典中的每个键。下面是一个示例代码,我在字典中迭代,并借助计数器和if语句访问每个键。没有计数器或if语句,还有其他方法访问密钥吗

def string_to_dict(csv):
    dict = []
    tmp = csv.splitlines()
    
    for i in tmp:
        tmp_dict = {"vorname" : "none", "nachname" : "none", "email" : "none"};
        tmp_i= i.split(",")
        counter = 0;

        for si in tmp_i:
            if counter ==0:
                tmp_dict["vorname"] = si
                counter =counter + 1
            elif counter == 1:
                tmp_dict["nachname"] = si
                counter = counter + 1
            else:
                tmp_dict["email"] = si
        dict.append(tmp_dict)
csv = """Donald,Duck,d.duck@entenhausen.com
    Wiley,Coyote,whiley@canyon.org
    Road,Runner,roadrunner@canyon.org"""

Tags: csv方法innoneforif字典counter
3条回答

让我们从这样一个事实开始,即您并没有尝试迭代字典,而是创建一个包含来自CSV格式字符串的字典条目的列表。 其次,代码中有很多python语法错误和错误。 避免使用保留字(如“dict”)作为参数名

如果这段代码对您有所帮助,您可以将其作为一个开始,但我建议您重新学习python语法和最佳实践

result = []
for line in csv.splitlines():
    vorname, nachname, email = line.split(",")
    result.append(
        {"vorname": vorname.strip(), "nachname": nachname.strip(), "email": email.strip()})

这也可以使用列表理解来完成,但可读性要差得多

如果您希望对到目前为止所做的操作进行最小的更改,那么只需获取list of keys并使用index值(在您的示例中为计数器变量),如下所示:

for i in tmp:
    tmp_dict = {"vorname" : "none", "nachname" : "none", "email" : "none"};
    tmp_i= i.split(",")
    counter = 0;
    keys = [*temp_dict.keys()]    # List of Keys
    for si in tmp_i:
        tmp_dict[keys[counter]] = si  # Key at index counter
        counter += 1
    dict.append(tmp_dict)

样本运行:

>>string_to_dict(csv)
[{'vorname': '    Road', 'nachname': 'Runner', 'email': 'roadrunner@canyon.org'}, {'vorname': '    Road', 'nachname': 'Runner', 'email': 'roadrunner@canyon.org'}, {'vorname': '    Road', 'nachname': 'Runner', 'email': 'roadrunner@canyon.org'}]

另一个注意事项:您将变量命名为dict您应该避免这样做,因为它是Python中的一个关键字

如果您已经期望姓名、姓氏和电子邮件,则不需要循环

def string_to_dict(csv):
    dict = []
    tmp = csv.splitlines()
    
    for i in tmp:
        tmp_dict = {"vorname" : "none", "nachname" : "none", "email" : "none"};
        tmp_i= i.split(",")

        tmp_dict["vorname"] = tmp_i[0]
        tmp_dict["nachname"] = tmp_i[1]
        tmp_dict["email"] = tmp_i[2]

        dict.append(tmp_dict)

我们可以不断迭代以改进解决方案:

def string_to_dict(csv):
    dict = []
    tmp = csv.splitlines()
    
    for i in tmp:
        tmp_dict = {"vorname" : None, "nachname" : None, "email" : None};
        tmp_i= i.split(",")

        tmp_dict["vorname"] = tmp_i[0]
        tmp_dict["nachname"] = tmp_i[1]
        tmp_dict["email"] = tmp_i[2]

        dict.append(tmp_dict)

更重要的是(如果您想使用受保护的关键字,如dict,命名约定是在其后面使用下划线):

def string_to_dict(csv):
    dict_ = []
    for line in csv.splitlines():
        vor_name, nach_name, email = line.split(",")
        dict_.append({"vorname" : vor_name, "nachname" : nach_name, "email" : email})
    return dict_

以及列表理解:

def string_to_dict(csv):
    def _parse_item(vor_name, nach_name, email):
        return {"vorname" : vor_name, "nachname" : nach_name, "email" : email}
    return [_parse_item(*line.split(",")) for line in csv.splitlines()]

相关问题 更多 >

    热门问题